面试被问到SPI总结
SPI驱动框架
1 枚举过程 drivers/spi/spi.c: spi_register_board_info /* 对于每一个spi_master,调用spi_match_master_to_boardinfo */ list_for_each_entry(master, &spi_master_list, list) spi_match_master_to_boardinfo /* board_info里含有bus_num, 如果某个spi_master的bus_num跟它一样 * 则创建一个新的spi_device */ if (master->bus_num == bi->busnum) spi_new_device spi_alloc_device /* 记录bi信息, 比如片选,MODE,MAX HZ */ spi_add_device /* 根据名字找到spi_driver, 调用它的probe函数 */ spi_setup(spi); device_add /* 会绑定到一个spi_driver */
2 数据收发过程 spi_write spi_message_init(&m); 初始化一个spi_message /* 一个不可打断的SPI传输过程: cs=0,传数据,cs=1 */ /* 一个spi_message由多个spi_transfer组成 */ spi_message_add_tail(&t, &m); /* spi_transfe是SPI上传输的单方向1个或多个字节 */ spi_sync(spi, &m); /* 启动传输并等待完成 */ 3 spi_driver如何调用spi_controller spi_sync __spi_sync(spi, message, 0); spi_async_locked __spi_async master->transfer(spi, message); wait_for_completion
具体使用时: