Linux内核SPI Bitbang驱动使用求助:无/dev设备节点问题
内核级GPIO模拟SPI驱动设备树配置分步指南
1. 定位设备树源文件
- 依据路由器CPU架构,找到对应内核源码目录下的设备树文件:
- ARM架构通常在
arch/arm/boot/dts/ - OpenWRT环境则在
target/linux/[你的芯片架构]/dts/
- ARM架构通常在
- 找到与你的路由器型号匹配的
.dts或.dtsi文件,比如xxx-router.dts
2. 添加GPIO模拟SPI控制器节点
打开目标设备树文件,在根节点(/)或GPIO相关父节点下插入以下节点,注意替换引脚参数为你的实际硬件连接:
spi_gpio: spi@0 { compatible = "spi-gpio"; #address-cells = <1>; #size-cells = <0>; gpio-sck = <&gpio 18 0>; /* 替换为你的SCK引脚编号,末尾0表示默认低电平 */ gpio-mosi = <&gpio 23 0>; /* 替换为你的MOSI引脚编号 */ /* ST7735无需MISO,可直接删除下面这行 */ // gpio-miso = <&gpio 25 0>; cs-gpios = <&gpio 24 1>; /* 片选引脚,末尾1表示默认高电平(无效状态) */ spi-max-frequency = <16000000>; /* 初始设为16MHz,可根据硬件调整至ST7735支持的上限 */ status = "okay"; };
注意:
compatible字段必须与你自定义驱动spidriv.c中of_match_table里的字符串完全一致,若你修改过驱动的兼容字符串,需同步调整此处。
3. 添加ST7735显示屏子节点
在上述spi_gpio节点内部,添加显示屏的设备描述节点:
display@0 { compatible = "sitronix,st7735r"; reg = <0>; /* 对应片选引脚的编号,此处为第0个片选 */ spi-max-frequency = <16000000>; dc-gpios = <&gpio 22 0>; /* 替换为你的数据/命令(D/C)引脚编号 */ reset-gpios = <&gpio 21 0>; /* 复位引脚,若无则可删除此行 */ rotate = <0>; /* 屏幕旋转角度:0/90/180/270,按需调整 */ status = "okay"; };
4. 编译设备树
- 原生内核环境编译(替换交叉编译工具链前缀):
make ARCH=arm dtbs CROSS_COMPILE=arm-linux-gnueabihf-
- OpenWRT环境编译(替换架构和设备型号):
make target/linux/[你的芯片架构]/compile CONFIG_TARGET_DEVICE=[你的路由器型号]
编译完成后,新生成的.dtb文件会存放在对应架构的dts输出目录下。
5. 更新设备树并重启
- 将编译好的
.dtb文件替换路由器/boot/目录下的原有设备树文件(比如/boot/xxx.dtb) - 重启路由器,确保新设备树生效
6. 加载驱动并验证
- 加载依赖模块:
modprobe spi-bitbang - 加载自定义驱动:
insmod spidriv.ko - 验证设备节点:
- 查看SPI控制器节点:
ls /sys/class/spi_master/,应出现spi0或对应编号的节点 - 查看用户态设备:
ls /dev/spidev*,应出现spidev0.0
- 查看SPI控制器节点:
- 查看驱动匹配日志:
dmesg | grep spi,若出现spi-gpio spi@0: probed类信息,说明匹配成功
关键注意事项
- 引脚编号必须与路由器SOC的GPIO定义一致,部分SOC采用“组+偏移”的编号方式,需参考硬件手册或现有设备树的引脚定义
- 若无需MISO引脚,必须删除
gpio-miso属性,否则驱动会因引脚缺失初始化失败 - 时钟频率不要超过ST7735的硬件上限(最大60MHz),避免出现显示异常或稳定性问题
内容的提问来源于stack exchange,提问作者Jeremiah
相关产品推荐
相关产品推荐

