spi 的同步和异步传输
spi_async spi_sync
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);
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);
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表示等待的事件已经完成