背景:根据自己需求更改官方提供设备树。
设备树目录:内核源码文件内arch/arm/boot/dts/。
- 复制一份源dts。cp arch/arm/boot/dts/imx7d-colibri-eval-v3.dts arch/arm/boot/dts/imx7d-colibri-eval-my-carrier.dts
- 扩展Makefile,加入对新dts的编译支持。vi arch/arm/boot/dts/Makefile。
- dts修改完成后,使用make dtbs生成新的imx7d-colibri-eval-my-carrier.dtb文件,以供内核加载。
dtb-$(CONFIG_SOC_IMX7D) += \
imx7d-cl-som-imx7.dtb \
imx7d-colibri-aster.dtb \
imx7d-colibri-emmc-aster.dtb \
imx7d-colibri-emmc-eval-v3.dtb \
imx7d-colibri-eval-v3.dtb \
imx7d-nitrogen7.dtb \
imx7d-sbc-imx7.dtb \
imx7s-colibri-aster.dtb \
imx7s-colibri-eval-v3.dtb \
imx7s-warp.dtb \
imx7d-colibri-eval-my-carrier.dtb
要覆盖属性,需要使用&字符和标签来引用该节点。较晚的设备树条目将覆盖较早的条目(条目的顺序顺序很重要,因此包含顺序很重要)。通常,较高的层(例如,载板设备树)会覆盖较低的层(例如,SoC设备树),因为较高的层一开始就包括较低的层。
例如,对于能够用作设备或主机(双角色)的USB控制器,可以使用dr_mode属性显式覆盖默认模式:
&usbdev0{
dr_mode = "host";
};
设备的重要属性是状态属性。它允许激活/停用设备。SoC级设备树中指定了许多设备,但是默认情况下它们被禁用。通过引用基本节点(使用&字符和标签),可以通过覆盖status属性的任何层来启用设备。
&uart4{
status = "okay";
};
整个节点可以通过简单地重新定义它们来覆盖。与覆盖属性一样,后面的定义会覆盖前面的定义。
例如,通过简单地在设备树中重新定义Vybrids UART2(UART_B)的引脚配置来覆盖uart2grp节点(此pinctrl规范已在imx7d-colibri.dtsi中定义,但具有CTS / RTS引脚)
&iomuxc {
pinctrl_uart2: uart2grp {
fsl,pins = <
MX7D_PAD_GPIO1_IO09__GPIO1_IO9 0x74
MX7D_PAD_GPIO1_IO09__GPIO1_IO9 0x14
>;
};
...
};
也可以使用/ delete-property /或/ delete-node /删除属性,甚至删除节点。以下示例删除载板级设备树imx6qdl-colibri.dtsi中定义的fsl,uart-has-rtscts属性:
&uart1 {
/delete-property/fsl,uart-has-rtscts;
};
删除节点,则使用名称。
/delete-node/backlight;
设备树允许使用别名重新排列某些设备类型。例如,这对于RTC很有用,因为第一个RTC设备被用作系统的主要时间源。应将主要时间源分配给rtc0别名(在本示例中,我们将snvsrtc分配为主要RTC,即Vybrids内部RTC):
aliases {
rtc0 = &snvsrtc;
rtc1 = &rtc;
};
如果需要其他设备的资源,则使用引用来连接两个设备。通常,它用于为设备分配资源,例如中断,时钟,GPIO或PWM通道。根据所引用的设备,需要一定数量的参数(单元格)。该数量在父设备的-cells属性中定义。
GPIO规范需要引用GPIO节点和一个或多个单元(参数)。单元格的数量取决于驱动程序。它可以从设备树绑定文档中获得,也可以通过查看GPIO控制器节点获得(输出GPIO的设备标有该gpio-controller
属性)。该#gpio-cells
属性定义了预期的单元数量。例如,GPIO控制器在imx7d.dtsi中定义如下:
gpio1: gpio@4004a000 {
compatible = "fsl,imx7d-gpio";
reg = <0x4004a000 0x1000 0x400ff040 0x40>;
gpio-controller;
#gpio-cells = <2>;
...