文章目录
1. introduction
由于 u-boot 先前将分区信息写得比较随意,不太方便随时修改,所以这里打算将分区相关的 code 重写,做到编译时、运行时都可以指定分区大小。
2. design
2.1 Kconfig
相关 Kconfig 添加设置分区大小的配置宏。
> General setup > xhr4412 Partition Info
2.2 fdisk
fdisk 重复代码优化一下。
2.3 partition
增加文件:
common/xhr4412/partition.c
include/xhr4412/partition.h
实现分区信息的显示、修改、读取、写入的功能。
2.4 misc
- 将 fastboot 写入 emmc 的逻辑移动到
2.3
的文件中,只保留写入的操作。 - 环境变量分区信息修改,读取所有分区信息到环境变量。
3. coding & debug
没什么好讲的。
先分这么多区吧,两个 dtb 分区,通过环境变量来选择一个 dtb 文件来启动。
static struct _part_info parts[PART_MAX] = {
DEF_PART(uboot, "bootloader", PART_FLAG_BOOTABLE),
DEF_PART(env, "env", PART_FLAG_NONE),
DEF_PART(kernel, "kernel", PART_FLAG_NONE),
DEF_PART(dtb1, "dtb", PART_FLAG_NONE),
DEF_PART(dtb2, "dtb2", PART_FLAG_NONE),
DEF_PART(mbr1, "mbr1", PART_FLAG_NONE),
DEF_PART(mbr2, "system", PART_FLAG_NONE),
DEF_PART(mbr3, "mbr3", PART_FLAG_NONE),
DEF_PART(mbr4, "mbr4", PART_FLAG_NONE),
};
4. test
优化了打印的内容,启动后打印分区信息。
5. usage
5.1 env val
bootcmd 改为:
#define CONFIG_BOOTCOMMAND \
"mmc dev 0 ; mmc read 40007000 ${kernel_blk} 5000 ;"\
"if env exists dtb_def; then mmc read 41000000 ${dtb_def} 80;"\
"else mmc read 41000000 ${dtb1_blk} 80; fi;bootm 40007000 - 41000000"
如果环境变量中不存在 dtb_def
,那么从 $dtb1_blk
地址读取 dtb 来启动,否则从 $dtb_def
地址启动 dtb。
5.2 new command
新增 showparts
命令,同时更新 dtb1_blk
dtb2_blk
kernel_blk
环境变量。
新增 mmc lock <open|close>
命令,用于打开 boot 分区的保护。
5.3 notice
除了配置 2.1
中的 env 大小外(单位:KB),还需要配置 Environment Size
,尽量让他们两处一致。当然,如果分区大小大于它,那也没关系。
因为 u-boot 用到 Environment Size
宏的地方比较多,懒得改了。。
reference
NEW
按照上面的修改后还是会出现很多 magic number,烧写镜像时还是不知道这个分区的起始地址是多少,非常不方便,所以决定再新增命令,直接对分区进行操作。
mmcpart 命令
mmcpart show
显示所有分区及其信息mmcpart read <part> <addr> [len]
将 <part> 分区读取到 <addr> 处,读取长度 [len] bytes,len 不超过分区大小mmcpart write <part> <addr> [len]
将 <addr> 处长度为 [len] 的 image 烧写到 <part> 分区中,len 不超过分区大小mmcpart erase <part>
擦除分区
另外环境变量的设置需要改两处也比较奇怪,所以保留 u-boot 官方的设置大小,删除新添加的冗余部分。所以环境变量也不使用分区起始地址来启动了,直接使用分区名,方便了不少。