簡介
dts文件描述了硬件每個模塊的信息,我們嵌入式軟件的調試很多時候都是在改dts文件,有時候我們不確定板子上的固件是否已經更新了我們的修改,這時候我們可以直接讀取板子上的dts信息,下面來演示一下。
進入uboot命令行模式
RK的默認SDK中,如果想進入uboot命令行模式,開機的時候在調試串口界面按住鍵盤的CTRL+C,上電,這時候如果看到如下信息,就說明已經進入uboot命令行模式:
Hit key to stop autoboot('CTRL+C'): 0
=> <INTERRUPT>
=> <INTERRUPT>
=> <INTERRUPT>
fdt基本操作
FDT,flatted device tree,直接翻譯過來是:扁平設備樹,大概意思就是把設備信息結構存放到device tree文件中。這里我們可以通過幫助選項看其應用:
=> fdt
fdt - flattened device tree utility commandsUsage:
fdt addr [-c] <addr> [<length>] - Set the [control] fdt location to <addr>
fdt apply <addr> - Apply overlay to the DT
fdt move <fdt> <newaddr> <length> - Copy the fdt to <addr> and make it active
fdt resize [<extrasize>] - Resize fdt to size + padding to 4k addr + some optional <extrasize> if needed
fdt print <path> [<prop>] - Recursive print starting at <path>
fdt list <path> [<prop>] - Print one level starting at <path>
fdt get value <var> <path> <prop> - Get <property> and store in <var>
fdt get name <var> <path> <index> - Get name of node <index> and store in <var>
fdt get addr <var> <path> <prop> - Get start address of <property> and store in <var>
fdt get size <var> <path> [<prop>] - Get size of [<property>] or num nodes and store in <var>
fdt set <path> <prop> [<val>] - Set <property> [to <val>]
fdt mknode <path> <node> - Create a new node after <path>
fdt rm <path> [<prop>] - Delete the node or <property>
fdt header - Display header info
fdt bootcpu <id> - Set boot cpuid
fdt memory <addr> <size> - Add/Update memory node
fdt rsvmem print - Show current mem reserves
fdt rsvmem add <addr> <size> - Add a mem reserve
fdt rsvmem delete <index> - Delete a mem reserves
fdt chosen [<start> <end>] - Add/update the /chosen branch in the tree<start>/<end> - initrd start/end addr
NOTE: Dereference aliases by omitting the leading '/', e.g. fdt print ethernet0.
讀dts信息
從上面的幫助選項我們可以看到,通過fdt list <path> [<prop>]
就可以讀到某個模塊的信息,那么,我們怎么知道對應模塊的path呢?以RK3568的otg口usbdrd_dwc3控制器節點為例,這里有兩種方法:
- 從源代碼的dts配置獲取
usbdrd30: usbdrd {compatible = "rockchip,rk3568-dwc3", "rockchip,rk3399-dwc3";clocks = <&cru CLK_USB3OTG0_REF>, <&cru CLK_USB3OTG0_SUSPEND>,┆<&cru ACLK_USB3OTG0>, <&cru PCLK_PIPE>;clock-names = "ref_clk", "suspend_clk",┆ "bus_clk", "pipe_clk";#address-cells = <2>; #size-cells = <2>; ranges;status = "disabled";usbdrd_dwc3: dwc3@fcc00000 {compatible = "snps,dwc3";reg = <0x0 0xfcc00000 0x0 0x400000>;interrupts = <GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>;dr_mode = "otg";phys = <&u2phy0_otg>, <&combphy0_us PHY_TYPE_USB3>;phy-names = "usb2-phy", "usb3-phy";phy_type = "utmi_wide";power-domains = <&power RK3568_PD_PIPE>;resets = <&cru SRST_USB3OTG0>;reset-names = "usb3-otg";snps,dis_enblslpm_quirk;snps,dis-u1u2-quirk;snps,dis-u2-freeclk-exists-quirk;snps,dis-del-phy-power-chg-quirk;snps,dis-tx-ipgap-linecheck-quirk;snps,dis_rxdet_inp3_quirk;snps,xhci-trb-ent-quirk;quirk-skip-phy-init;status = "disabled";}; };
從rk3568.dtsi可以看到,usbdrd_dwc3是在usbdrd30節點下面,usbdrd30是根節點,因此path應該是:/usbdrd/dwc3@fcc00000
- 打印所有節點信息
在uboot命令行模式下,執行fdt print
可以把dts所有的節點信息打印出來,然后查找到你想要的節點名字,如:
usbdrd_dwc3 = "/usbdrd/dwc3@fcc00000";
因此path應該是:/usbdrd/dwc3@fcc00000
確認path之后,執行指令,結果為:
=> fdt list /usbdrd/dwc3@fcc00000
dwc3@fcc00000 {compatible = "snps,dwc3";reg = <0x00000000 0xfcc00000 0x00000000 0x00400000>;interrupts = <0x00000000 0x000000a9 0x00000004>;dr_mode = "otg";phys = <0x00000024 0x00000020 0x00000004>;phy-names = "usb2-phy", "usb3-phy";phy_type = "utmi_wide";power-domains = <0x00000021 0x0000000f>;resets = <0x0000001f 0x00000094>;reset-names = "usb3-otg";snps,dis_enblslpm_quirk;snps,dis-u1u2-quirk;snps,dis-u2-freeclk-exists-quirk;snps,dis-del-phy-power-chg-quirk;snps,dis-tx-ipgap-linecheck-quirk;snps,dis_rxdet_inp3_quirk;snps,xhci-trb-ent-quirk;quirk-skip-phy-init;status = "okay";extcon = <0x00000025>;phandle = <0x0000016f>;
};