spidev的使用(SPI用户态API)


文章目录

  • spidev的使用(SPI用户态API)
  • 参考资料:
    • 一、 spidev驱动程序分析
      • 1.1 驱动框架
      • 1.2 驱动程序分析
        • 1.2.1 读函数
        • 1.2.2 写函数
        • 1.2.3 通过ioctl读写参数
        • 1.2.4 通过ioclt读写数据
    • 二、spidev应用程序分析
      • 2.1 使用方法
      • 2.2 代码分析
        • 2.2.1 显示设备属性
        • 2.2.2 读数据
        • 2.2.3 先写再读
        • 2.2.4 同时读写
    • 三、spidev的缺点
  • 致谢


参考资料:

  • 内核驱动:drivers\spi\spidev.c

  • 内核提供的测试程序:tools\spi\spidev_fdx.c

  • 内核文档:Documentation\spi\spidev

一、 spidev驱动程序分析

内核驱动:drivers\spi\spidev.c

1.1 驱动框架

设备树示例:

spidev0: spidev@0 {compatible = “spidev”;reg = <0>;spi-max-frequency = <50000000>;};

设备树里某个spi设备节点的compatible属性等于下列值,就会跟spidev驱动匹配:

  • “rohm,dh2228fv”
  • “lineartechnology,ltc2488”
  • “spidev”

匹配之后,spidev.c的spidev_probe会被调用,它会:

  • 分配一个spidev_data结构体,用来记录对于的spi_device
  • spidev_data会被记录在一个链表里
  • 分配一个次设备号,以后可以根据这个次设备号在链表里找到spidev_data
  • device_create:这会生产一个设备节点/dev/spidevB.D,B表示总线号,D表示它是这个SPI Master下第几个设备

以后,就可以通过/dev/spidevB.D来访问spidev驱动程序。

1.2 驱动程序分析

spidev.c通过file_operations向APP提供接口:

1.2.1 读函数

1.2.2 写函数

1.2.3 通过ioctl读写参数

1.2.4 通过ioclt读写数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-th7vbZ1v-1677471644710)(pic/28_spdev_rw_data.png)]

二、spidev应用程序分析

内核提供的测试程序:tools\spi\spidev_fdx.c

2.1 使用方法

spidev_fdx [-h] [-m N] [-r N] /dev/spidevB.D
  • -h: 打印用法
  • -m N:先写1个字节0xaa,再读N个字节,**注意:**不是同时写同时读
  • -r N:读N个字节

2.2 代码分析

2.2.1 显示设备属性

2.2.2 读数据

2.2.3 先写再读

2.2.4 同时读写

三、spidev的缺点

使用read、write函数时,只能读、写,这是半双工方式。

使用ioctl可以达到全双工的读写。

但是spidev有2个缺点:

  • 不支持中断
  • 只支持同步操作,不支持异步操作:就是read/write/ioctl这些函数只能执行完毕才可返回

使用read、write函数时,只能读、写,这是半双工方式。

使用ioctl可以达到全双工的读写。

但是spidev有2个缺点:

  • 不支持中断
  • 只支持同步操作,不支持异步操作:就是read/write/ioctl这些函数只能执行完毕才可返回


致谢

以上笔记源自韦东山老师的视频课程,感谢韦老师,韦老师是嵌入式培训界一股清流,为嵌入式linux开发点起的星星之火,也愿韦老师桃李满园。聚是一团火,散是满天星!

在这样一个速食的时代,坚持做自己,慢下来,潜心琢磨,心怀敬畏,领悟知识,才能向下扎到根,向上捅破天,背着世界往前行!
仅此向嵌入行业里的每一个认真做技术的从业者致敬!