移植u-boot学习笔记9-----u-boot裁剪和修改默认参数
2016-09-15 11:25
351 查看
1、u-boot中的环境变量
(1)
在u-boot中可以设置这些东西这些东西会在哪里,我们可以修改代码,让这些参数存在某个地方上。u-boot启动时,会首先读取参数,然后判断是否有效,有效就用,无效就用默认参数。默认参数在代码里面写死了。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/736d736fff8a9d58a4b0ea5684e432ee)
(2)看启动信息出现bad CRC(校验码错误)
就是说我们没有在flash上面保存、设置参数。u-boot想去读的时候,里面的数据格式是不对的,就会出现bad CRC警告,就会使用默认的环镜变量
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/ad99930a2467dbc10dda4e06cafb5ed4)
2、默认的环镜变量
(1)在哪里设置
在u-boot代码里搜索using default environment
在Env_common.c里面
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/0d0fb119feb80cbf4cdc84b4b2b7a000)
里面的defaut_environment
这里bootargs是传给内核的参数,
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/5e8502eb75ea855499e3b6e353e5a32d)
(2)修改默认环镜变量
在include\configs\smdk2440.h中定义
规划nand flash,前面部分放bootloader,然后放参数,然后放内核,往后的地方放文件系统。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/a214970287c579cc07f9807c1ae38c00)
设置传给内核参数
console=ttySAC0表示内核打印信息从串口0输出出来。root=/dev/mtdblock3表示文件系统在第3个mtd块(共4个)。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/ebaa962a2c7bc57275fe3aef2f34b1d8)
(3)u-boot启动后如何启动内核
根据bootcmd这个环境变量,执行里面的命令启动内核。
从nand flash里面读,
3、裁剪u-boot
(1)输入help查看各种命令
(2)修改配置文件include\configs\smdk2440.h
去掉不必要的宏定义
(3)编译uboot时出现错误,只要修改相应文件对应目录下的Makefile,把此文件取消编译进内核。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/36bf8e77c0aa4410e4d3e71b06a2894e)
(4)重新编译
销毁之前编译的目标
make distclean(编译时出错找不到原因就清除重新编译)
配置
make smdk2440_config
编译
make
4、重新划分区
(1)参考以前旧的内核,按照里面的分区来划。
设置单板和服务器IP还有Mac地址,用tftp下载uImage,然后启动uImage,看看里面的分区。按照内核里面的分区修改u-boot代码。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/fc9d683695b3b0a7c279c6ad9dd084b2)
(2)启动内核,查看内核打印出来的分区
40000就是256K,参数在40000~60000
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/b10f45ab9e5ef0cdffd8b51f62aad3e0)
(3)在u-boot中找不到cmd_save.c文件,也找不到do_save函数。因而重启u-boot,看看save命令有什么帮助信息,根据帮助信息找到对应的文件,再根据哪些文件来确定用什么宏。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/d8a882b9ad2d4ec51eee1ad0910c602c)
在u-boot中查找saveenv,看Env_nand.c(对于nand flash)和Env_flash.c(对于nor flash),我们要编译 这个文件,看看common目录里面它的Makefile,根据Makefile来确定一下Env_flash.c这个文件依赖于什么宏。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/410ef4f898a56ba33ab1bb770d80bd01)
查看common目录下的MakefileEnv_flash.c这个文件依赖于宏CONFIG_ENV_IS_IN_NAND
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/17dbe5546d07931169112dd591714ff5)
所以要定义CONFIG_ENV_IS_IN_NAND这个宏
在include\configs\smdk2440.h中定义
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/b59de4257e6186fcacc94c4051b30b7e)
想存在哪里(想存在0x40000哪里),可用偏移地址宏CONFIG_ENV_OFFSET,
选择0x20000的要求:nand flash一个块的大小必须是整块128K,所以取值需要时128K的整数倍,nand
flash是以块为单位擦出的
而大小用宏CONFIG_ENV_SIZE定义为0x20000(60000-40000)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/96828e55c59b53063407916105059110)
(5)存在nand flash的哪里,进env_nand.c这个文件看看
nand_erase_options.length是nand flash的擦除参数length,也就是说我们设置参数时要先擦除nand flash,擦除CONFIG_ENV_RANGE这么长,如果擦除的长度小于环境变量参数的大小就返回错误。因而宏CONFIG_ENV_RANGE需要设置为大于或等于CONFIG_ENV_SIZE
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/b8eb119c52251bef83c9d6b6ff222836)
5、实验
(1)设置参数并烧写、重启
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/5b7c79d92f473c4ec478c6a79b853877)
reset
(2)打印参数信息
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/d8fece6e2ce0e330c80db2e51673b174)
(3)保存设置的参数(save命令)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/f936889de952ed60f49ad9d90fbdcae1)
(4)用tftp下载并烧写内核到nand flash里(根据之前的分区,下载2M到60000里面去),需要先擦除nand flash
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/5c1cbdb852bb10f8709d62a1cc9c2476)
(5)上面总是用到地址和大小的数值,相当麻烦,修改u-boot,用某些名字代替
在u-boot中搜索mtdpart
我们在u-boot写的这些所谓的分区,只不过是为了方便我们使用,吧某些数值用某个名字代替而已。划分分区要根据内核来,U-boot做的这些所谓的分区只不过是在代码里面写的一些东西,方便我们查看使用而已,不会对内核有任何影响,所划的分区不会传到内核里面去。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/85544bb201873d3f4963ea1bc4ab6304)
查看Cmd_mtdparts.c在common目录下,查看common目录下的Makefile,搜索mtdparts
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/ec1ad31fba38db35a5bd7c42d35d7057)
我们要定义宏CONFIG_CMD_MTDPARTS,Cmd_mtdparts.c才会编译进u-boot,u-boot才会支持mtdpart这个命令。
在配置文件[b]include\configs\smdk2440.h中定义宏[/b]
[b]
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/cca92753d30a76baa7dfd85658e4ab18)
[/b]
[b](6)分区如何划分(在cmd_mtdparts.c文件里)[/b]
mtdparts_init()函数没有被别的程序调用,因而在board.c里面调用此函数。
(不想分析代码就模仿别人怎么设置)
在配置文件include\configs\smdk2440.h中定义
这里减号代表剩下的所有,宏CONFIG_MTD_DEVICE在下面会提及
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/8ba1038e6ec892f1a17bc83d41d25811)
(7)编译并解决错误
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/3f7d939bf895e07a91abd376c69fda00)
说get_mtd_device_nm没有定义,而这个函数在drivers\mtd\Mtdcore.c中定义,可能文件Mtdcore.c没有被编译进u-boot,查看所在目录的Makefile,搜索core
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/b9b0c6234ff152a0c17960690d3f1430)
知道要Mtdcore.c被编译进u-boot,需要定义宏CONFIG_MTD_DEVICE
6、实验2
(1)用tftp命令下载u-boot到SDRSM
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/622fe5f5346620156722b41cc595a3ef)
(2)去除nor flash的写保护,并擦除256K,从SDRAM 中拷贝到nor flash的0地址处并用reset命令重启。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/d528a46cf5832780ffb57b0dc3947128)
(3)用mtdpart命令查看分区
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/00516496fd623bc7a365145383fc75a1)
(4)下载内核、烧写内核(用名字代替数值)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/21cd9d696bb92962ab69865a43d242f3)
参考下面名字对应数值
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/1dfa23328310db6344a6933edc1821b3)
先要用mtdparts default命令设置默认分区,再来擦除。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/87415d03f099eb408b788632b44ea0cd)
烧写
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/c3a1dd30d054b8618a32024f37008935)
(5)不想手工执行命令mtdparts default
在代码里让他执行,在board.c中执行run_command函数,左边的参数是命令,右面的参数可以随便写。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/5d8143f8c1be2b424dbe749c8fb7fb93)
(6)修改bootcmd
在include\configs\smdk2440.h中修改
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/2b1fb783fbe0e53db41d7a0582d3808e)
在u-boot中修改bootcmd参数保存并重启,用print命令查看
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/10/f4716d7b7bb58783d2806ba28c604099)
(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命令查看
相关文章推荐
- 移植u-boot学习笔记9-----u-boot裁剪和修改默认参数
- u-boot-2016.05移植:(6)、修改默认参数
- 移植u-boot学习笔记7-----修改代码之支持nand flash
- 移植u-boot学习笔记4-----修改代码之建新板_时钟
- 移植u-boot学习笔记6-----修改代码支持nor flash
- 06-S3C2440学习之移植2012u-boot到S3C2440(移植过程五--最终)裁剪+修改默认参数+分区设置+支持文件系统下载
- 移植u-boot学习笔记5----- 修改代码之支持NAND启动
- 移植u-boot学习笔记8-----修改代码之支持DM9000网卡
- 移植u-boot-2012.04----修改默认参数、烧写yaffs文件
- 移植uboot第八步:裁剪、修改默认参数、分区
- 移植u-boot-2015.07-rc3之uboot裁剪及启动参数修改(九)
- TQ2440 学习笔记—— 29、移植U-Boot【U-Boot 的编译、链接过程】
- TQ2440 学习笔记—— 30、移植U-Boot【U-Boot 的启动过程第一阶段源码分析】
- Uboot学习笔记③---(uboot移植及启动过程)
- C++中构造函数默认参数学习笔记
- TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程】
- TQ2440 学习笔记—— 32、移植U-Boot【U-Boot 的移植】
- AM335x(TQ335x)学习笔记——u-boot-2014.10移植
- 基于TQ2440的u-boot 1.1.6移植(一)(文件裁剪、时钟修改)
- 移植u-boot1.1.6到友善mini2440学习笔记之环境搭建(系列之一)