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)
/*
* board_info 里含有 bus_num , 如果某个 spi_master 的 bus_num 跟它一样
* 则创建一个新的 spi_device
*/
spi_match_master_to_boardinfo
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