3. 配置RK3399内核设备树
任务说明
在RK3399平台上,通过修改内核设备树源文件(.dts),添加一个自定义GPIO节点,重新编译内核并烧录后,在系统/proc/device-tree或sysfs中验证该节点及其属性是否可见。本案例以RK3399官方Linux内核(4.4/4.19分支)为基准,使用默认配置编译。
环境与依赖
- RK3399开发板(如RockPro64、Firefly-RK3399)
- Linux主机(Ubuntu 18.04+),已安装交叉编译工具链:
aarch64-linux-gnu-gcc - 内核源码树:
git clone https://github.com/rockchip-linux/kernel.git,分支rk3399-linux或release-4.4 - 设备树编译工具:
dtc(设备树编译器,内核编译时自动调用)
实现步骤
1. 定位RK3399设备树源文件:arch/arm64/boot/dts/rockchip/rk3399-firefly.dts(以Firefly为例,其他板卡替换为对应dts文件)。
2. 在根节点/下添加自定义GPIO节点,使用RK3399的GPIO2_D5引脚(对应GPIO2组第29脚,bank=2, group=D, index=5)。该引脚在硬件上连接板载LED或空闲排针,具体以实际板卡原理图为准。
3. 编译内核生成boot.img或单独的设备树blob(rk3399-firefly.dtb)。
4. 烧录并启动系统,验证节点可见性。
关键完整代码
在rk3399-firefly.dts的根节点/ { }内部添加以下节点:
/* 自定义GPIO节点:GPIO2_D5 = GPIO2 <29> */
gpio_led_test: gpio-led-test {
compatible = "gpio-leds";
status = "okay";
led-test {
label = "test-led";
gpios = <&gpio2 RK_PD5 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
};
/* 备用方案:直接暴露GPIO控制器引用 */
custom-gpio {
compatible = "rockchip,custom-gpio";
test-gpio = <&gpio2 RK_PD5 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&gpio2_pd5_pin>;
};
同时需要在pinctrl节点中定义引脚复用(若内核未默认配置):
&pinctrl {
gpio2_pd5_pin: gpio2-pd5-pin {
rockchip,pins = <2 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
以上代码中RK_PD5和RK_FUNC_GPIO宏定义在include/dt-bindings/pinctrl/rockchip.h中,内核源码已包含,无需额外添加。
编译与烧录
# 设置环境变量
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
# 加载默认配置(以Firefly为例)
make rockchip_defconfig
# 编译设备树(仅生成dtb)
make dtbs
# 或完整编译内核生成boot.img
make -j8
./mkimage.sh
编译产物:arch/arm64/boot/dts/rockchip/rk3399-firefly.dtb。使用RK开发工具(如upgrade_tool)将dtb烧录到resource分区,或使用boot.img整体烧录。
验证方法
系统启动后,执行以下命令检查节点是否可见:
# 检查设备树节点是否存在
ls /proc/device-tree/gpio-led-test/
cat /proc/device-tree/gpio-led-test/compatible
cat /proc/device-tree/gpio-led-test/status
# 检查GPIO是否被内核驱动接管
ls /sys/class/leds/
cat /sys/class/leds/test-led/brightness
# 手动控制LED(若硬件连接)
echo 1 > /sys/class/leds/test-led/brightness
echo 0 > /sys/class/leds/test-led/brightness
通过条件:
/proc/device-tree/gpio-led-test/目录存在,且compatible文件内容为gpio-leds;/sys/class/leds/test-led符号链接存在,说明GPIO LED驱动已成功匹配并注册;- 写入
brightness文件能控制对应引脚电平变化(用万用表测量或观察LED亮灭)。
常见问题
- 节点未出现:确认dts文件修改后是否重新编译并烧录了正确的dtb;检查
status = "okay"是否设置。 - GPIO被占用:查看
/sys/kernel/debug/gpio确认引脚是否已被其他驱动申请,必要时在dts中禁用冲突节点。 - 引脚复用错误:若GPIO无法控制,检查
pinctrl设置是否正确,确保引脚未被复用为I2C/UART等功能。