Bootstrap

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)
            /* 
             * 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

1319058-20180311235438535-88073314.png

转载于:https://www.cnblogs.com/GyForever1004/p/8525962.html

;