手动加载SPI驱动模块时如何定义引脚及设备树相关配置问题
SPI自定义驱动开发常见问题解答
问题1:设备树compatible字段要求与手动加载驱动的关系
即使你用insmod手动加载驱动,设备树中对应SPI设备节点的compatible字段也必须填写,核心规则如下:
- Linux SPI子系统匹配驱动和硬件设备的核心逻辑,就是将设备树
compatible字段的值与驱动内of_device_id数组声明的兼容字符串做比对,该规则和驱动是内置到内核、还是手动加载的模块没有任何关联。 - 手动加载驱动时,内核完成模块加载后会自动遍历SPI总线的设备链表,只有
compatible字段匹配成功,才会触发执行驱动内的probe初始化函数,没有匹配逻辑的情况下驱动无法关联到对应的硬件实例,直接初始化失败。 - 如果你不想走设备树匹配流程,也可以在驱动代码中硬编码SPI总线号、片选号等参数,通过
spi_new_device或spi_register_board_info接口注册SPI设备,但该方式可移植性极差,非特殊场景不推荐使用。
问题2:SPI MISO/MOSI引脚的配置规则
SPI的MISO、MOSI、SCK属于总线公共引脚,不属于单个SPI设备的配置范畴,配置规则如下:
- 绝大多数ARM/ARM64平台的SPI公共引脚,是在SPI控制器的设备树节点中通过
pinctrl相关属性完成配置的,包括引脚复用关系、上下拉参数、速率等级等。只要确认对应SPI总线的控制器节点已经正确配置了这三个引脚,挂载到该总线下的所有SPI设备都不需要再单独配置这三个引脚。 - 只有少数没有
pinctrl子系统的平台,或者SPI控制器驱动有特殊要求的场景,才需要在控制器节点中通过miso-gpios、mosi-gpios、sck-gpios属性单独指定引脚,这种情况需要参考所用SoC的SPI控制器官方绑定文档。 - 你看到的开发示例只提及总线号、片选配置,就是因为默认SPI总线本身已经提前完成了公共引脚的配置,单个设备仅需要指定所属总线、专属的片选引脚即可。
内容的提问来源于stack exchange,提问作者Fulgor3
相关产品推荐
相关产品推荐

