Linux下SPI设备驱动实验:创建SPI节点及SPI设备子节点

一. 简介

SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动。主机控制器驱动一般由半导体厂商写好,我们来编写SPI设备驱动代码。
前一篇文章分析了 IMX6U系列芯片的 SPI中片选信号的处理,文章如下:
接下来我们就来学习如何在 Linux 下编写 SPI 设备驱动。本实验的最终目的就是驱动 I.MX6U
ALPHA 开发板上的 ICM-20608 这个 SPI 接口的六轴传感器,可以在应用程序中读取 ICM-20608
的原始传感器数据。

这里主要学习创建SPI节点及ICM20608设备(SPI从设备)子节点。

二.  ICM20608设备的硬件原理图

ICM20608设备的硬件原理图如下所示:

通过硬件原理图可以看出,ICM20608设备(SPI设备)的SPI使用的是(IMX6ULL的)SPI3接口,的四个IO对应如下:

SPI3_CS  ->  UART2_TXD   //片选信号
SPI3_SCLK  -> UART2_RXD  //时钟信号
SPI3_MISO  -> UART2_RTS  //主收从发
SPI3_MOSI  -> UART2_CTS  //主发从收

三. 创建SPI节点及SPI设备子节点

这里学习支持设备树的情况下,通过设备节点信息来描述SPI设备信息,方法就是在设备树文件中创建SPI节点及SPI设备节点,IO的pinctrl节点。

1. 创建IO的pinctrl节点

打开ubuntu系统,通过 vscode软件打开 Linux内核源码(NXP官方提供。在 imx6ull-14x

### 如何在 Linux SPI 节点上实现设备驱动程序的编写与集成 #### 设备树中的SPI节点配置 为了使新的SPI设备能够被Linux识别并加载相应的驱动,在设备树源文件(DTS)中定义新设备是必要的。对于RK3568平台而言,这涉及到修改特定于该SoC的DTS文件以包含目标SPI外设的信息[^1]。 ```dts spi@ff0c0000 { compatible = "rockchip,rk3568-spi"; reg = <0xff0c0000 0x100>; interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>; spidev@0 { /* 新增子节点 */ compatible = "spidev"; spi-max-frequency = <5000000>; // 设置最大频率为5MHz reg = <0>; // CS线编号 }; }; ``` 上述代码片段展示了如何向已存在的SPI控制器下挂接一个新的`spidev`兼容型设备实例,并指定了其工作参数如CS号以及通信速率上限等特性设置。 #### 编写对应的字符设备驱动框架 接下来就是创建实际用于控制这个虚拟SPI设备的应用层接口——即所谓的“字符设备”。这里给出一个简化版的例子来说明基本结构: ```c #include <linux/module.h> #include <linux/spi/spi.h> static int my_spi_probe(struct spi_device *spi) { printk(KERN_INFO "My SPI device driver probed\n"); return 0; } static void my_spi_remove(struct spi_device *spi) { printk(KERN_INFO "My SPI device driver removed\n"); } static struct of_device_id my_spi_of_match[] = { {.compatible = "mycompany,myspidevice"}, {}}; MODULE_DEVICE_TABLE(of, my_spi_of_match); static struct spi_driver my_spi_driver = { .driver = { .name = "my_spidev", .of_match_table = my_spi_of_match, }, .probe = my_spi_probe, .remove = my_spi_remove, }; module_spi_driver(my_spi_driver); MODULE_LICENSE("GPL"); ``` 这段C语言编写的模块实现了最基本的探测(`probe`)和移除(`remove`)回调函数;更重要的是声明了一个匹配表项用来关联之前提到过的DTB里的`compatible`字段值,从而建立起硬件实体同本驱动之间的映射关系[^2]。 #### 加载自定义驱动并与用户空间交互 完成以上两步之后,当系统启动时如果检测到了符合描述符条件的新组件,则会自动调用注册好的探针方法尝试建立连接。与此同时也可以通过/sys/class/spidev路径访问到由内核暴露出来的伪文件系统入口以便应用程序读取/写入数据流或下发命令给底层物理层执行具体动作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值