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