君正X2000E(LPDDR2) uboot和kernel在线升级
君正X2000E存储使用的是Nand Flash,所以uboot和kernel的升级可以使用MTD工具里的flash_erase和nandwrite来实现nand flash的擦除和写入。
u-boot升级
X2000E的分区划分在使用君正的镜像烧录工具cloner烧录时会自动划分好,具体的划分规则可以根据 ”配置 -> SFC -> 分区信息“ 来调整。
查看nand flash分区信息,可以使用以下命令:
# cat /proc/mtd dev: size erasesize name mtd0: 00100000 00020000 "uboot" mtd1: 00800000 00020000 "kernel" mtd2: 0f500000 00020000 "rootfs"
如上,共有mtd0 ~ mtd2三个分区,分别作为uboot、kernel、rootfs分区使用。
注意:
在线升级uboot的时候,由于没有默认实现uboot内置flash参数,使用nand_write写入新的uboot文件后无法正常启动。
解决办法:
-
需要修改uboot配置文件
例:u-boot/include/configs/halley5.h
/* 打开如下配置宏 */ #define CONFIG_NAND_BUILTIN_PARAMS
- 添加一款flash参数,配置文件路径如下:
u-boot/tools/ingenic-tools/sfc_builtin_params/nand_device.c
- nand flash设备参数默认编译进镜像,因此只需要配置partitions参数,具体如下所示:
/* * params: nand flash partitions */ nand_partition_builtin_params_t nand_builtin_params = { .magic_num = SPINAND_MAGIC_NUM, /* max 10 partitions*/ .partition_num = 3, #if 0 .partition_num = 4, #endif .partition = { [0].name = "uboot", [0].offset = 0x0, [0].size = 0x100000, [0].mask_flags = NANDFLASH_PART_RW, [0].manager_mode = MTD_MODE, [1].name = "kernel", [1].offset = 0x100000, [1].size = 0x800000, [1].mask_flags = NANDFLASH_PART_RW, [1].manager_mode = MTD_MODE, [2].name = "rootfs", [2].offset = 0x900000, [2].size = 0x0, [2].mask_flags = NANDFLASH_PART_RW, [2].manager_mode = UBI_MANAGER, #if 0 [2].name = "rootfs", [2].offset = 0x900000, [2].size = 0x2800000, [2].mask_flags = NANDFLASH_PART_RW, [2].manager_mode = UBI_MANAGER, [3].name = "userdata", [3].offset = 0x3100000, [3].size = 0xcf00000, [3].mask_flags = NANDFLASH_PART_RW, [3].manager_mode = UBI_MANAGER, #endif }, };
如上所示,划分了3个分区,分别是uboot、kernel、rootfs三个分区。rootfs分区的大小我们这里设置为0,表示把除uboot分区和kernel分区以外的空间都作为rootfs分区。当然,你也可以设置为你想要的分区大小和分区个数。
u-boot升级步骤
- 擦除uboot分区
# flash_erase /dev/mtd0 0 0 Erasing 128 Kibyte @ e0000 -- 100 % complete
- 写入uboot分区
# nandwrite -p /dev/mtd0 uboot Writing data to block 0 at offset 0x0 Writing data to block 1 at offset 0x20000 Writing data to block 2 at offset 0x40000
kernel升级步骤
- 擦除kernel分区
# flash_erase /dev/mtd1 0 0 Erasing 128 Kibyte @ 7e0000 -- 100 % complete
- 写入kernel分区
# nandwrite -p /dev/mtd1 kernel Writing data to block 0 at offset 0x0 Writing data to block 1 at offset 0x20000 Writing data to block 2 at offset 0x40000 Writing data to block 3 at offset 0x60000 Writing data to block 4 at offset 0x80000 Writing data to block 5 at offset 0xa0000 Writing data to block 6 at offset 0xc0000 Writing data to block 7 at offset 0xe0000 Writing data to block 8 at offset 0x100000 Writing data to block 9 at offset 0x120000 Writing data to block 10 at offset 0x140000 Writing data to block 11 at offset 0x160000 Writing data to block 12 at offset 0x180000 Writing data to block 13 at offset 0x1a0000 Writing data to block 14 at offset 0x1c0000 Writing data to block 15 at offset 0x1e0000 Writing data to block 16 at offset 0x200000 Writing data to block 17 at offset 0x220000 Writing data to block 18 at offset 0x240000 Writing data to block 19 at offset 0x260000 Writing data to block 20 at offset 0x280000 Writing data to block 21 at offset 0x2a0000 Writing data to block 22 at offset 0x2c0000 Writing data to block 23 at offset 0x2e0000 Writing data to block 24 at offset 0x300000 Writing data to block 25 at offset 0x320000 Writing data to block 26 at offset 0x340000 Writing data to block 27 at offset 0x360000 Writing data to block 28 at offset 0x380000 Writing data to block 29 at offset 0x3a0000 Writing data to block 30 at offset 0x3c0000 Writing data to block 31 at offset 0x3e0000 Writing data to block 32 at offset 0x400000 Writing data to block 33 at offset 0x420000 Writing data to block 34 at offset 0x440000 Writing data to block 35 at offset 0x460
u-boot和kernel升级完之后,reboot即可生效。
如何判断uboot和kernel升级成功了呢?
- uboot可根据cpu启动时uboot打印的build时间来判断
- kernel可根据 uname -a 的结果得到kernel的build时间
拓展
君正X2000系列有三种型号,分别是X2000(LPDDR3)、X2000E(LPDDR2)、X2000H(LPDDR3),那么对于X2000和X2000H的uboot在线升级,可以和X2000E使用同一个uboot文件吗?
显然不行,由于DDR类型不同,所以在u-boot里要区分开来,X2000和X2000H要使用针对LPDDR3的u-boot配置。
修改如下:
iff --git a/u-boot/include/configs/halley5.h b/u-boot/include/configs/halley5.h index 35017de475..cfc714fd20 100644 --- a/u-boot/include/configs/halley5.h +++ b/u-boot/include/configs/halley5.h @@ -97,7 +97,7 @@ #define CONFIG_DDR_HOST_CC /*#define CONFIG_DDR_TYPE_DDR3*/ #define CONFIG_DDR_TYPE_LPDDR3 -#define CONFIG_DDR_TYPE_LPDDR2 +/*#define CONFIG_DDR_TYPE_LPDDR2*/ #define CONFIG_DDR_CS0 1 /* 1-connected, 0-disconnected */ #define CONFIG_DDR_CS1 0 /* 1-connected, 0-disconnected */ #define CONFIG_DDR_DW32 0 /* 1-32bit-width, 0-16bit-width */ @@ -118,7 +118,7 @@ /* #define CONFIG_LPDDR3_MT52L256M32D1PF_FPGA*/ /* #define CONFIG_LPDDR3_AD310032C_AB_FPGA */ #define CONFIG_LPDDR3_W63AH6NKB_BI - #define CONFIG_LPDDR3_NK6CL256M16DKX_H1 + /*#define CONFIG_LPDDR3_NK6CL256M16DKX_H1*/ #endif #define CONFIG_DDR_PHY_IMPEDANCE 40
如果你使用君正的cloner烧录工具烧录u-boot的话,你会发现,即使你不做上面的改动,X2000/X2000H和X2000E使用同一个uboot文件,都可以正常使用。那是因为烧录工具cloner在烧录时会根据不同的CPU型号烧录不同的配置。
- X2000 使用cloner烧录时选用的配置

- X2000E 使用cloner烧录时选用的配置

至此,一切都明朗了。
本文来自博客园,作者:闹闹爸爸,转载请注明原文链接:https://www.cnblogs.com/wanglouxiaozi/p/16935878.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)