linux spi驱动与应用调用流程

linux spi驱动与应用调度流程


一. 驱动注册流程

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,这样就将应用与驱动挂起勾了
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值