您的位置:首页 > 其它

移植u-boot学习笔记9-----u-boot裁剪和修改默认参数

2016-09-15 11:25 351 查看
1、u-boot中的环境变量

(1)

在u-boot中可以设置这些东西这些东西会在哪里,我们可以修改代码,让这些参数存在某个地方上。u-boot启动时,会首先读取参数,然后判断是否有效,有效就用,无效就用默认参数。默认参数在代码里面写死了。






(2)看启动信息出现bad CRC(校验码错误)

就是说我们没有在flash上面保存、设置参数。u-boot想去读的时候,里面的数据格式是不对的,就会出现bad CRC警告,就会使用默认的环镜变量






2、默认的环镜变量

(1)在哪里设置

在u-boot代码里搜索using default environment

在Env_common.c里面






里面的defaut_environment

这里bootargs是传给内核的参数,



(2)修改默认环镜变量

在include\configs\smdk2440.h中定义

规划nand flash,前面部分放bootloader,然后放参数,然后放内核,往后的地方放文件系统。






设置传给内核参数

console=ttySAC0表示内核打印信息从串口0输出出来。root=/dev/mtdblock3表示文件系统在第3个mtd块(共4个)。






(3)u-boot启动后如何启动内核

根据bootcmd这个环境变量,执行里面的命令启动内核。

从nand flash里面读,

3、裁剪u-boot

(1)输入help查看各种命令

(2)修改配置文件include\configs\smdk2440.h

去掉不必要的宏定义

(3)编译uboot时出现错误,只要修改相应文件对应目录下的Makefile,把此文件取消编译进内核。






(4)重新编译

销毁之前编译的目标

make distclean(编译时出错找不到原因就清除重新编译)

配置

make smdk2440_config

编译

make 

4、重新划分区

(1)参考以前旧的内核,按照里面的分区来划。

设置单板和服务器IP还有Mac地址,用tftp下载uImage,然后启动uImage,看看里面的分区。按照内核里面的分区修改u-boot代码。






(2)启动内核,查看内核打印出来的分区

40000就是256K,参数在40000~60000






(3)在u-boot中找不到cmd_save.c文件,也找不到do_save函数。因而重启u-boot,看看save命令有什么帮助信息,根据帮助信息找到对应的文件,再根据哪些文件来确定用什么宏。






在u-boot中查找saveenv,看Env_nand.c(对于nand flash)和Env_flash.c(对于nor flash),我们要编译 这个文件,看看common目录里面它的Makefile,根据Makefile来确定一下Env_flash.c这个文件依赖于什么宏。






查看common目录下的MakefileEnv_flash.c这个文件依赖于宏CONFIG_ENV_IS_IN_NAND







所以要定义CONFIG_ENV_IS_IN_NAND这个宏

在include\configs\smdk2440.h中定义






想存在哪里(想存在0x40000哪里),可用偏移地址宏CONFIG_ENV_OFFSET,

选择0x20000的要求:nand flash一个块的大小必须是整块128K,所以取值需要时128K的整数倍,nand
flash是以块为单位擦出的

而大小用宏CONFIG_ENV_SIZE定义为0x20000(60000-40000)






(5)存在nand flash的哪里,进env_nand.c这个文件看看

nand_erase_options.length是nand flash的擦除参数length,也就是说我们设置参数时要先擦除nand flash,擦除CONFIG_ENV_RANGE这么长,如果擦除的长度小于环境变量参数的大小就返回错误。因而宏CONFIG_ENV_RANGE需要设置为大于或等于CONFIG_ENV_SIZE






5、实验

(1)设置参数并烧写、重启






reset

(2)打印参数信息






(3)保存设置的参数(save命令



(4)用tftp下载并烧写内核到nand flash里(根据之前的分区,下载2M到60000里面去),需要先擦除nand flash



(5)上面总是用到地址和大小的数值,相当麻烦,修改u-boot,用某些名字代替

在u-boot中搜索mtdpart

我们在u-boot写的这些所谓的分区,只不过是为了方便我们使用,吧某些数值用某个名字代替而已。划分分区要根据内核来,U-boot做的这些所谓的分区只不过是在代码里面写的一些东西,方便我们查看使用而已,不会对内核有任何影响,所划的分区不会传到内核里面去。



查看Cmd_mtdparts.c在common目录下,查看common目录下的Makefile,搜索mtdparts



我们要定义宏CONFIG_CMD_MTDPARTS,Cmd_mtdparts.c才会编译进u-boot,u-boot才会支持mtdpart这个命令。

在配置文件[b]include\configs\smdk2440.h中定义宏[/b]

[b]


[/b]

[b](6)分区如何划分(在cmd_mtdparts.c文件里)[/b]

mtdparts_init()函数没有被别的程序调用,因而在board.c里面调用此函数。
(不想分析代码就模仿别人怎么设置)


在配置文件include\configs\smdk2440.h中定义

这里减号代表剩下的所有,宏CONFIG_MTD_DEVICE在下面会提及






(7)编译并解决错误






说get_mtd_device_nm没有定义,而这个函数在drivers\mtd\Mtdcore.c中定义,可能文件Mtdcore.c没有被编译进u-boot,查看所在目录的Makefile,搜索core






知道要Mtdcore.c被编译进u-boot,需要定义宏CONFIG_MTD_DEVICE

6、实验2

(1)用tftp命令下载u-boot到SDRSM






(2)去除nor flash的写保护,并擦除256K,从SDRAM 中拷贝到nor flash的0地址处并用reset命令重启。






(3)用mtdpart命令查看分区






(4)下载内核、烧写内核(用名字代替数值)






参考下面名字对应数值






先要用mtdparts default命令设置默认分区,再来擦除。






烧写






(5)不想手工执行命令mtdparts default

在代码里让他执行,在board.c中执行run_command函数,左边的参数是命令,右面的参数可以随便写。








(6)修改bootcmd

在include\configs\smdk2440.h中修改






在u-boot中修改bootcmd参数保存并重启,用print命令查看




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: