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

来源:互联网 发布:开启dynamic qos网络 编辑:程序博客网 时间:2024/05/06 21:09

移植u-boot学习笔记9-----u-boot裁剪和修改默认参数http://blog.csdn.net/qingkongyeyue/article/details/52549175


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这个命令。

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


(6)分区如何划分(在cmd_mtdparts.c文件里)

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命令查看


阅读全文
0 0
原创粉丝点击