
Hi Tim,
On 10/7/21 4:07 PM, Tim Harvey wrote:
Greetings,
I'm working on some features for the imx8mm-venice boards I support which depend on making small changes to the dt before booting Linux.
The purpose is not to have any of this apply to the U-Boot controlling dt but instead to the Linux kernel dt applied within ft_board_setup. I could apply these changes with code but it would be way more readable if there was a way to store these as fragments in the FIT image and apply them.
The fragments would be small and have to do with two UART's routed to a multi-protocol RS232/RS485 transceiver that can be used as either of the following:
- two tx/rx UART's (the default configuration for my dt's)
- one rs232 uart with CTS/RTS flow control
- one rs485 uart
Here would be an example dt overlay to apply over the default arch/arm/dts/imx8mm-venice-gw73xx-0x.dts to change it from 2x RS232 UARTS with TX/RX (uart2/uart4) to RS485 half duplex:
/* For RS485 HD:
- UART4_TX is DE for RS485 transmitter
- RS485_EN needs to be pulled high
- RS485_HALF needs to be pulled high
- RS485_TERM enables on-chip termination
*/ &uart2 { rts-gpios = <&gpio5 29 GPIO_ACTIVE_HIGH>; rs485-term-gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>; };
&uart4 { status = "disabled"; };
&iomuxc { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_hog>;
pinctrl_hog: hoggrp { fsl,pins = < MX8MM_IOMUXC_GPIO1_IO00_GPIO1_IO0
0x40000104 /* RS485_TERM */ MX8MM_IOMUXC_SAI1_RXFS_GPIO4_IO0 0x40000144 /* RS485_EN */ MX8MM_IOMUXC_SAI1_RXD0_GPIO4_IO2 0x40000144 /* RS485_HALF */ >; };
pinctrl_uart2: uart2grp { fsl,pins = < MX8MM_IOMUXC_UART2_RXD_UART2_DCE_RX 0x140 MX8MM_IOMUXC_UART2_TXD_UART2_DCE_TX 0x140 MX8MM_IOMUXC_UART4_TXD_GPIO5_IO29 0x140 >; };
};
Anyone do anything like this before or work with dt fragments/overlays in U-Boot or have any other suggestions?
I had the exact same use case. A couple of prerequisites:
* Compile kernel DTB with __symbols__ ('-@' argument to dtc) * Enable FIT devicetree overlays in u-boot - Slightly different CONFIG_s for loading FITs from u-boot or SPL * Assemble a FIT with overlays in it
I think there's also a way to do apply overlays from the u-boot commandline, but I never found that to be intuitive.
You might have to specify a "loadaddr=" for the overlays if you're loading the FIT from u-boot instead of SPL. AFAIR the u-boot FIT loader is defective in this regard.
Alex
APPENDIX A: Example FIT ITS
/dts-v1/ ;/ { description = "Flu-boot image with overlays"; #address-cells = <1>; images { kernel-1 { description = "Linux kernel"; data = /incbin/("kernel/zImage"); type = "kernel"; arch = "arm"; os = "linux"; compression = "none"; load = <0xc2000040>; entry = <0xc2000040>; hash-1 { algo = "sha256"; }; };
fdt-stm32mp157c-dk2.dtb { description = "Flattened Device Tree blob"; data = /incbin/("kernel/stm32mp157c-dk2.dtb"); type = "flat_dt"; arch = "arm"; compression = "none"; hash-1 { algo = "sha256"; }; }; fdt-dk2-can1-enable.dto { description = "Flattened Device Tree blob"; data = /incbin/("overlays/dk2-can1-enable.dto"); type = "flat_dt"; arch = "arm"; compression = "none"; hash-1 { algo = "sha256"; }; }; }; configurations { secure-stm32mp157c-dk2.dtb { description = "Linux for stm32mp157c-dk2.dtb"; kernel = "kernel-1"; fdt = "fdt-stm32mp157c-dk2.dtb", "fdt-dk2-can1-enable.dto"; hash-1 { algo = "sha256"; }; }; }; };