Linux spi驱动框架之执行流程

来源:互联网 发布:隐藏电脑录像软件 编辑:程序博客网 时间:2024/05/17 22:02

转载地址:http://blog.csdn.net/chenliang0224/article/details/72617253

一. 驱动注册流程

1. static int nuc970_spi1_probe(struct platform_device *pdev)
2. err = spi_bitbang_start(&hw->bitbang);
3. INIT_WORK(&bitbang->work, bitbang_work);//初始化工作队列
4. INIT_LIST_HEAD(&bitbang->queue);//初始化链表
5. master->transfer = spi_bitbang_transfer;//绑定spi传输函数(这里只是初始化,真正调用该函数是在应用程序部分,第二部分会讲到,只需记住这个关键的函数)
5.1 将应用层spi传输的数据加入到链表中,同时将数据提交给队列bitbang->work
list_add_tail(&m->queue, &bitbang->queue);//m->queue加入到第4点的bitbang->queue链表中
queue_work(bitbang->workqueue, &bitbang->work); //提交给bitbang->workqueue队列,这使将调用第3点的bitbang_work函数


二. 应用程序调用流程
1. spidev.c (SPI设备层,对应应用程序打开的open\read\write...API)
1. 该文件的内部读、写函数最终都会调用核心层spi.c的API向底层驱动交互数据
1. spi.c(SPI核心层)
1. int spi_write_then_read(struct spi_device *spi, const void *txbuf, unsigned n_tx, void *rxbuf, unsigned n_rx)
2. status = spi_sync(spi, &message);
3. __spi_sync(spi, message, 0);
4. status = spi_async_locked(spi, message);
5. __spi_async(spi, message);
6. master->transfer(spi, message);//这个传输函数是个关键函数,将调用第一.5,这样就将应用与驱动挂起勾了
原创粉丝点击