
/*
* spi的传输是可以从硬件上做优化的. 本文从软件、硬件上来分析
* ok, 我们来欣赏一下.
* 该函数最终调用了 spi_controller 提供的transfer_one()函数来进行数据的传输.
* transfer_one()在 spi_controller初始化注册到设备驱动模型中时被赋值 .
*
* 参数 .
* spi : 与 spi controller 进行交互的 spi 设备
* message : spi controller 、spi device 数据交互的载体
*/
int spi_sync(struct spi_device *spi, struct spi_message *message)
{
int ret;
/*
* 加了一把互斥锁. 大家有次序一个一个的来吧.
*/
mutex_lock(&spi->controller->bus_lock_mutex);
/*
* ok, 它是同步的, 一直等待传输完成. wait_for_completion().
* 返回值是 message中的 status 成员
* 函数失败的原因有很多种,成功就一种,所以返回0表示success, 非0为failed.
* 我C! 程序中也有"潜规则"啊,😄. 大家都一直在这样用吧.
* 看参数, 毫发无损的传入. kenrle雪藏了很多api, 封装起来, EXPORT_SYMBOL_GPL导出使用.
* 哈哈😄, 惯性技俩了. 这一层一层的,论一个洋葱的极限拉扯 !
*/
ret = __spi_sync(spi, message);
mutex_unlock(&spi->controller->bus_lock_mutex);
return ret;
}
EXPORT_SYMBOL_GPL(spi_sync);
/*
* 朱熹先生说过. 唯有源头活水来, 那我们就看看两个参数的源头来源于哪里
* 因为下面会对该参数进行校验, 严格着呢 !
*/
static int __spi_sync(struct spi_device *spi, struct spi_message *message)
{
}