SDK 设备树介绍
1. 设备树介绍
设备树(Device Tree)是 Linux 内核中用于描述板级硬件信息的一种机制。它以文本形式编写,通常采用 .dts(Device Tree Source)或 .dtsi(Device Tree Source Include)作为扩展名。其中,.dts 文件定义具体的硬件设备信息,而 .dtsi 文件则用于提取通用的设备或平台配置,被 .dts 文件引用。 Luckfox Pico 的设备树文件位于 luckfox-pico SDK/sysdrv/source/kernel/arch/arm/boot/dts 目录下。
设备树在编译过程中,.dts 和 .dtsi 文件会被编译为二进制格式的 .dtb(Device Tree Blob)文件。系统启动时,U-Boot 会将 .dtb 文件加载到内存中,内核在启动过程中解析该文件,根据其中的设备信息完成硬件初始化、驱动加载以及设备节点的注册等操作。 需要注意的是,从 Linux 4.4 内核开始引入了动态设备树(Dynamic Device Tree)机制,允许在系统运行时修改或覆盖 .dtb 中的部分配置。内核驱动将根据新的配置信息进行动态调整,而不仅仅依赖启动阶段加载的静态 .dtb。
2. 设备树配置简介
Luckfox Pico 的镜像编译阶段首先需要选择对应的板级支持文件。
./build.sh lunch
板级支持文件信息被软链接到
< luckfox-pico SDK >/.BoardConfig.mk板级支持文件配置了 Luckfox Pico 型号对应的 .dts 文件,其中 Luckfox Pico 硬件设计通用部分较多的型号使用的 .dts 文件会包含同一个 .dtsi 文件以方便统一管理。
不同型号对应的.dts 和 .dtsi 设备树文件如下:
型号 .dts .dtsi Luckfox Pico rv1103g-luckfox-pico.dts rv1103-luckfox-pico-ipc.dtsi Luckfox Pico mini a rv1103g-luckfox-pico-mini-a.dts rv1103-luckfox-pico-ipc.dtsi Luckfox Pico mini b rv1103g-luckfox-pico-mini-b.dts rv1103-luckfox-pico-ipc.dtsi Luckfox Pico plus rv1103g-luckfox-pico-plus.dts rv1103-luckfox-pico-ipc.dtsi Luckfox Pico pro/max rv1106g-luckfox-pico-pro-max.dts rv1106-luckfox-pico-pro-max-ipc.dtsi Luckfox Pico ultra rv1106g-luckfox-pico-ultra.dts rv1106-luckfox-pico-ultra-ipc.dtsi Luckfox Pico ultra W rv1106g-luckfox-pico-ultra-w.dts rv1106-luckfox-pico-ultra-ipc.dtsi Luckfox Pico Pi A/B rv1106g-luckfox-pico-pi.dts rv1106-luckfox-pico-pi-ipc.dtsi Luckfox Pico Pico Pi A/B W rv1106g-luckfox-pico-pi-w.dts rv1106-luckfox-pico-pi-ipc.dtsi Luckfox-Pico-86-Panel-0208/0408 rv1106g-luckfox-pico-86panel.dts rv1106-luckfox-pico-86panel-ipc.dtsi Luckfox-Pico-86-Panel-1208/1408 rv1106g-luckfox-pico-86panel-w.dts rv1106-luckfox-pico-86panel-ipc.dtsi
3. 设备树配置
3.1 设备树文件结构
Luckfox Pico 使用的 RV1103 / RV1106 芯片相关的设备树基本配置 rv1106.dtsi、rv1106-pinctrl.dtsi 等由 Rockchip 提供,结合 Luckfox Pico 具备的硬件资源在 .dtsi 中配置 Luckfox Pico 的默认配置,最后在 .dts 文件配置型号特定的硬件设备信息。
- .dts 文件中的配置信息优先级最高可以覆盖 .dtsi 文件的配置,可以引用 .dtsi 的节点修改属性或重新创建节点
- 为了方便编辑,板级支持文件对应的 .dts 文件在执行 ./build.sh 后会软链接到
< luckfox-pico SDK >/config/dts_config下,正常仅需要对其编辑配置设备功能,.dtsi 文件不作改动
3.2 常用配置
3.2.1 GPIO 配置
引脚在默认情况下作为 GPIO ,利用 sysfs 可以配置其输出高低电平,但是默认上下拉只能通过设备树或写入寄存器进行配置。以配置gpio1 pc7默认为上拉为例在 < luckfox-pico SDk >/config/dts_config 中添加
/{
/*-------------------------------------------------------*/
/*----------------------other data-----------------------*/
/*-------------------------------------------------------*/
gpio1pc7:gpio1pc7 {
compatible = "regulator-fixed";
pinctrl-names = "default";
pinctrl-0 = <&gpio1_pc7>;
regulator-name = "gpio1_pc7";
regulator-always-on;
};
};
&pinctrl {
gpio1-pc7 {
gpio1_pc7:gpio1-pc7 {
rockchip,pins = <1 RK_PC7 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
};
gpio1pc7表示新建的节点,必须放在原有的根节点下,不能单独新建根节点other data表示默认配置的 luckfox pico 的 model 和 compatible 属性。pcfg_pull_up表示默认上拉,pcfg_pull_down表示默认下拉,pcfg_pull_none表示默认无上下拉。
3.2.2 PWM 配置
PWM 功能同一时间只能被一个引脚使用,比如 PWM1M0 跟 PWM1_M1 对应的引脚无法同时作为 PWM1 使用,控制使用引脚主要通过 pinctrl 属性实现。以使能 PWM1M0 为例在 < Luckfox-pico SDK >/config/dts_config 中添加
&pwm1 {
status = "okay";
pinctrl-0 = <&pwm1m0_pins>;
};
&pwm1表示引用的节点,来源参考 rv1106.dtsi&pwm1m0_pins表示引用的 pinctrl 节点,包含引脚和复用模式信息,来源参考 rv1106-pinctrl.dtsi。- 由于 PWM 的频率和占空比都可以使用sysfs进行设置,所以pwm的设备树配置仅配置使能状态。
3.2.3 UART 配置
UART 功能同一时间只能被一组引脚使用,比如 UART1M0 和 UART1M1 引脚组无法同时使用,组合内的引脚也不能拆开来组合使能,控制使用引脚主要通过 pinctrl 属性配置。以使能 UART1M0 为例在 < Luckfox-pico SDK >/config/dts_config 中添加
&uart1 {
status = "okay";
pinctrl-0 = <&uart1m0_xfer>;
};
&uart1表示引用的节点,来源参考 rv1106.dtsi&uart1m0_xfer表示引用的pinctrl 节点,包含引脚和复用模式信息,来源参考 rv1106-pinctrl.dtsi。- 如果需要启动流控,还需要在确定该组 uart 具备流控引脚的前提下在 pinctrl-0 属性中添加流控所需要的 ctsn 和 rtsn 引脚信息。
3.2.4 I2C 配置
I2C 功能同一时间只能被一组引脚使用,比如 I2C0M0 和 I2C0M1 无法同时使用,组合内的引脚也不能拆开来组合使能,控制使用引脚主要通过 pinctrl 属性配置。以使能 I2C0M0 为例在 < Luckfox-pico SDK >/config/dts_config 中添加
&i2c0 {
status = "okay";
pinctrl-0 = <&i2c0m0_xfer>;
clock-frequency = <100000>;
};
&i2c0表示引用的节点,来源参考 rv1106.dtsi&i2c0m0_xfer表示引用的 pinctrl 节点,包含引脚和复用模式信息,来源参考 rv1106-pinctrl.dtsiclock-frequency属性配置的是 I2C 的时钟频率,单位是 Hz 可以根据实际情况进行配置,默认i2c使用标准模式配置为 100000(100kHZ) 即可
3.2.5 SPI 配置
SPI 功能同一时间只能被一组引脚使用,比如 SPI0M0 和 SPI0M1 无法同时使用,组合内的引脚也不能拆开来组合使能,但是同一组 SPI 的引脚可以不全部使用(比如仅使能 CLK 和 MISO 引脚),主要通过pinctrl属性配置,rv1106-pinctrl.dtsi 提供的 pinctrl 节点不一定能满足使用,可以修改或新建 pinctrl 节点。以使能SPI0M0,仅使能 CLK 和 MOSI 引脚为例在 < Luckfox-pico SDK >/config/dts_config 中添加
&spi0 {
status = "okay";
pinctrl-0 = <&spi0m0_clk &spi0m0_mosi>;
spidev@0 {
status = "okay";
compatible = "rockchip,spidev";
spi-max-frequency = <50000000>;
reg = <0>;
};
fbtft@0 {
status = "disabled";
};
};
&spi0表示引用的节点,来源参考 rv1106.dtsipinctrl-0引用的节点在对应 Luckfox Pico 型号的 .dtsi 中配置,和 rv1106-pinctrl.dtsi 的节点区别为将每个引脚单独分开以便于组合spi-max-frequency属性配置的是SPI的时钟频率,单位是Hz可以根据实际情况进行配置,默认spi使用50MHzspidev@0表示引用 .dtsi 的子节点,用于作为 SPI 通信的主设备使用fbtft@0在支持 fbtft 的 luckfox pico 对应的 .dtsi 中有配置,不能和 spidev@0 同时使能,如果对应的 .dtsi 中没有fbtft@0 节点,此处的设置也没有影响pinctrl/spi0配置了spi0m0_clk、spi0m0_mosi、spi0m0_miso、spi0m0_cs0 四个引脚,但仅使用了spi0m0_clk 和 spi0m0_mosi,没有被使用的引脚不会被使能为 SPI 功能/* 该 pinctrl 节点的创建已经在 dtsi 实现,在 dts 不需要添加 */
&pinctrl {
spi0 {
spi0m0_clk: spi0m0-clk {
rockchip,pins = <1 RK_PC1 4 &pcfg_pull_none>;
};
spi0m0_mosi: spi0m0-mosi {
rockchip,pins = <1 RK_PC2 6 &pcfg_pull_none>;
};
spi0m0_miso: spi0m0-miso {
rockchip,pins = <1 RK_PC3 6 &pcfg_pull_none>;
};
spi0m0_cs0: spi0m0-cs0 {
rockchip,pins = <1 RK_PC0 4 &pcfg_pull_none>;
};
};
};
3.2.6 USB 配置
Luckfox Pico 的 USB 默认使用 peripheral 模式,USB 作为从设备电脑可以使用 adb 进入终端,并作为 RNDIS 设备接入电脑局域网。在 peripheral 模式下直接插入 U 盘、键盘等外设是没有反应的,需要在设备树中将 USB 模式配置为 host 才能作为主设备识别接入的外设。以配置 USB 为 host 为例在 < Luckfox-pico SDK >/config/dts_config 中添加
&usbdrd_dwc3 {
status = "okay";
dr_mode = "host";
};
&usbdrd_dwc3表示引用的配置 USB 模式的节点,其他依赖的 USB 节点已经默认使能,来源和默认配置参考 rv1106.dtsi 和 Luckfox Pico 型号对应的 .dtsi 文件dr_mode属性配置的是 USB 的模式,host 表示主设备模式,peripheral 表示从设备模式。
3.2.7 CSI 配置
Luckfox Pico 的 CSI 默认开启,在 Luckfox Pico / Mini / Plus / Pro / Max 上插入 CSI 摄像头就可以进行控制,在 Luckfox Pico Ultra / Ultra W 上I2C4 除了CSI 其他引脚组也被引出,所以需要修改 I2C4 的 pinctrl-0 属性才能让 CSI 接口正常使用。以在 Luckfox Pico Ultra 上使能 CSI 接口正常工作为例在 < Luckfox-pico SDKJ >/config/dts_config 中添加
&csi2_dphy_hw {
status = "okay";
};
&i2c4 {
status = "okay";
clock-frequency = <400000>;
pinctrl-0 = <&i2c4m2_xfer>;
};
&csi2_dphy_hw表示引用的CSI2 D-PHY的节点,是 CSI 接口的底层节点,该节点没有使能会使其他节点的属性设置失效&i2c4表示引用的 i2c4 节点,其有关 Sensor 的子节点在对应的 .dtsi 下,默认已经开启对 SC3336 的支持pinctrl-0在 Luckfox Pico Ultra 中被默认配置为 "<&i2c4m0_xfer &i2c4m1_xfer &i2c4m2_xfer>"以确保最终编译生成的dtb中的设备树信息完整,这里在dts中配置会覆盖dtsi中的配置使CSI正确使能