spi sync async

 

spi 的同步和异步传输
spi_async spi_sync
先看 spi_sync
 return __spi_sync(spi, message, 0);
  DECLARE_COMPLETION_ONSTACK(done);
  status = __spi_queued_transfer(spi, message, false);//注意这个false
   list_add_tail(&msg->queue, &master->queue);
  __spi_pump_messages(master, false);//注意这个false
   queue_kthread_work(&master->kworker, &master->pump_messages);
  wait_for_completion(&done);
再看 spi_async
spi_async
 ret = __spi_async(spi, message);
  return master->transfer(spi, message);//注意: master->transfer = spi_queued_transfer;
   return __spi_queued_transfer(spi, msg, true);
    list_add_tail(&msg->queue, &master->queue);
    queue_kthread_work(&master->kworker, &master->pump_messages);  

可以看到
async的spi传输 直接用过工作队列启动work,不进行阻塞
sync的 spi传输通过 wait_for_completion 进行睡眠等待传输完成 通过一个 void complete(struct completion *c);来进行唤醒
这个 message->complete = spi_complete; 在spi_finalize_current_message中被调用 这个完成量为 message->context = &done;
done指示等待的事件是否完成。初始化时为0。如果为0,则表示等待的事件未完成。大于0表示等待的事件已经完成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值