弄Linux也有半年多的时间了,自己选择的这条路是相对曲折的,有时真的是没有时间来搞。有时则是自己过分关注一些细节,整的自己的实际项目没有什么进展。实际上是打击了自己学习的积极性。还是要推进些自己有用的项目,而不是依学习进度。
要准确判断出自己的进度,不要低估了自己,也不要高估了自己,及时调整自己的策略。
spi基础准备
spi的驱动框架
主要分为了三个层次,用户空间,内核空间和硬件。
用户空间:spi设备的具体的功能。包括具体的协议控制和数据传输工作。
内核空间:也分为了三部分;
spi控制器驱动层:对应于内核的spidev.c的spi标准驱动;适用于特定spi总线控制器的读写方法,并注册到linux内核的spi架构。此层对应的就是内核空间的设备驱动程序。
spi通用接口封装层:提供核心的api接口。对应于驱动中的spi.c文件,是内核中的原生文件。
spi控制器驱动:对应于驱动中的spi-suxi.c文件。
主要的传数据的接口,官方手册中指定的接口函数
spi_message_init();//初始化一个 SPI message 结构
spi_message_add_tail();//向 SPI message 中添加一个 transfer
spi_sync();//启动、并等待 SPI 总线处理完指定的 SPI message
linux官网中的接口函数
-
简易函数
/** * SPI同步写 * @spi: 写哪个设备 * @buf: 数据buffer * @len: 长度 * 这个函数可以休眠 * * 返回值: 0-成功, 负数-失败码 */ static inline int spi_write(struct spi_device *spi, const void *buf, size_t len); /** * SPI同步读 * @spi: 读哪个设备 * @buf: 数据buffer * @len: 长度 * 这个函数可以休眠 * * 返回值: 0-成功, 负数-失败码 */ static inline int spi_read(struct spi_device *spi, void *buf, size_t len); /** * spi_write_then_read : 先写再读, 这是一个同步函数 * @spi: 读写哪个设备 * @txbuf: 发送buffer * @n_tx: 发送多少字节 * @rxbuf: 接收buffer * @n_rx: 接收多少字节 * 这个函数可以休眠 * * 这个函数执行的是半双工的操作: 先发送txbuf中的数据,在读数据,读到的数据存入rxbuf * * 这个函数用来传输少量数据(建议不要操作32字节), 它的效率不高 * 如果想进行高效的SPI传输,请使用spi_{async,sync}(这些函数使用DMA buffer) * * 返回值: 0-成功, 负数-失败码 */ extern int spi_write_then_read(struct spi_device *spi, const void *txbuf, unsigned n_tx, void *rxbuf, unsigned n_rx); /** * spi_w8r8 - 同步函数,先写8位数据,再读8位数据 * @spi: 读写哪个设备 * @cmd: 要写的数据 *