uboot dtb的修改命令fdt移植

一、移植宗旨

我们仍然使用u-boot 1.1.6, 在这个版本上我们实现了很多功能: usb下载,菜单操作,网卡永远使能等, 不忍丢弃.
需要在里面添加fdc命令命令, 这个命令可以用来查看、修改dtb
从u-boot官网下载最新的源码, 把里面的 cmd/fdt.c移植过来.
u-boot官网源码:
ftp://ftp.denx.de/pub/u-boot/

二、移植fdt命令

1、拷贝文件

u-boot-2018.11-rc2\scripts\dtc\libfdt
把新u-boot中cmd/fdt.c重命名为cmd_fdt.c , 和 lib/libfdt/* 一起复制到老u-boot的common/fdt目录
主要拷贝如下文件
uboot dtb的修改命令fdt移植

2、 修改Makefile来编译

修改 老u-boot/Makefile, 添加一行: LIBS += common/fdt/libfdt.a
修改 老u-boot/common/fdt/Makefile, 仿照 drivers/nand/Makefile来修改,修改如下
uboot dtb的修改命令fdt移植

3、移植时常见问题

i. No such file or directory:
要注意,
#include “xxx.h” // 是在当前目录下查找xxx.h
#include <xxx.h> // 是在指定目录下查找xxx.h, 哪些指定目录呢?
// 编译文件时可以用"-I"选项指定头文件目录,
// 比如: arm-linux-gcc -I

-c -o …
// 对于u-boot来说, 一般就是源码的 include目录

解决方法:
从新uboot里面确定头文件在哪, 把它移到include目录或是源码的当前目录

ii. xxx undeclared :
宏, 变量, 函数未声明/未定义

从新uboot里面找到他们去定义它们。
对于宏, 去定义它;
对于变量, 去定义它或是声明为外部变量;
对于函数, 去实现它或是声明为外部函数;

iii. 上述2个错误是编译时出现的,
当一切都没问题时, 最后就是链接程序, 这时常出现: undefined reference to `xxx’
这表示代码里用到了xxx函数, 但是这个函数没有实现

解决方法: 去实现它, 或是找到它所在文件, 把这文件加入工程

4、 fdt命令使用示例

nand read.jffs2 32000000 device_tree // 从flash读出dtb文件到内存(0x32000000)
fdt addr 32000000 // 告诉fdt, dtb文件在哪
fdt print /led pin // 打印/led节点的pin属性
fdt get value XXX /led pin // 读取/led节点的pin属性, 并且赋给环境变量XXX
print XXX // 打印环境变量XXX的值
fdt set /led pin <0x00050005> // 设置/led节点的pin属性
fdt print /led pin // 打印/led节点的pin属性
nand erase device_tree // 擦除flash分区
nand write.jffs2 32000000 device_tree // 把修改后的dtb文件写入flash分区