可加载内核模块(LKM)是否需设备树?树莓派4 SPI ADC驱动疑问
树莓派4 ADS7950 SPI ADC LKM驱动相关问题解答
1. 仅开发LKM是否需要创建设备节点?
- 得看你的实际需求:
- 如果要让用户空间程序能读写这个ADC(比如通过
/dev下的文件接口),必须创建设备节点。有两种实现方式:- 手动创建:用
mknod /dev/ads7950 c <主设备号> <次设备号>命令,但主设备号容易出现冲突,且每次加载模块都得手动操作,效率很低。 - 驱动自动生成:在LKM代码里调用
class_create()和device_create()接口,模块加载时自动在/dev目录下生成对应节点,卸载时自动清理,这是工业界的标准做法,既省心又规范。
- 手动创建:用
- 要是你的驱动仅给其他内核模块提供接口,完全不与用户空间交互,那可以不用创建设备节点,但这种场景对于ADC驱动来说几乎不存在。
- 如果要让用户空间程序能读写这个ADC(比如通过
2. LKM需要设备树吗?
- 有两种选择,但更推荐使用设备树:
- 使用设备树(推荐):SPI设备的硬件参数(比如SPI总线号、片选引脚、时钟频率)都可以通过设备树传递给驱动。你可以给树莓派添加一个设备树overlay,定义ADS7950的节点,设置
compatible = "ti,ads7950",然后在LKM里通过匹配这个字符串来绑定设备。这种方式完全符合Linux设备模型,无需在驱动里硬编码硬件参数,换硬件配置只需修改设备树,不用改动驱动代码。 - 不使用设备树:直接在LKM里硬编码SPI总线号、片选号、时钟频率,然后调用
spi_new_device()注册设备。但这种方式过于死板,换板子或改硬件连接就得修改驱动代码,不符合Linux驱动的设计理念,不推荐。
- 使用设备树(推荐):SPI设备的硬件参数(比如SPI总线号、片选引脚、时钟频率)都可以通过设备树传递给驱动。你可以给树莓派添加一个设备树overlay,定义ADS7950的节点,设置
内容的提问来源于stack exchange,提问作者curlywei
相关产品推荐
相关产品推荐

