文章目录
1、获取设备树在内存中的地址
如果不知道 Uboot
设备树地址的话,可以通过 printenv
命令查看环境变量,一般环境变量中带有 fdt_addr
结尾的是设备树地址。
2、fdt 命令设置设备树地址
命令格式:
fdt addr 设备数地址
举例:
fdt addr 0x130000 // 0x130000是我的设备树在内存中的地址
3、打印设备树信息
3.1、查看根节点的设备树信息
使用 fdt list
命令,如下:
Uboot#fdt list
/ {
aliases {
};
cpus {
};
soc {
};
..............
memory@00 {
};
gpio-keys {
};
};
3.2、查看指定节点的设备树信息
在在 fdt print
后面加路径可以打印指定信息,比如根节点下有 gpio-keys
节点,举例如下:
Uboot#fdt print /gpio-keys
gpio-keys {
compatible = "gpio-keys";
key-reset {
label = "key-reset";
gpios = <0x00000019 0x0000000b 0x00000000>;
linux,code = <0x00000198>;
};
};
3.3、使用 fdt print 命令可以查看全部的设备树信息,并得到完整的设备树的 dts 和 dtb 文件
如果你没有设备树文件,这个命令就很有用了。
在使用 fdt print
打印出全部的设备树信息后,可以将保存到 dts
文件中,然后修改其中某些节点信息,最后在 linux 下使用 dtc
命令编译为 dtb
,再替换到设备对应的设备树地址上,完成修改。
比如保存为 uboot.dts 文件,编译成 uboot.dtb 文件。使用下面的命令:
dtc -I dtb -O dts -o uboot.dts uboot.dtb
-I 指定输入格式
-O 指定输出格式
-o 指定输出文件
扩展:
下面是 fdt
的相关命令:
fdt - flattened device tree utility commands
Usage:
fdt addr [-c] <addr> [<length>] - Set the [control] fdt location to <addr>
fdt boardsetup - Do board-specific set up
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 [get <var> <member>] - Display header info
get - get header member <member> and store it in <var>
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.
谢谢点赞关注哈!