君正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升级步骤

  1. 擦除uboot分区
    # flash_erase /dev/mtd0 0 0 
    Erasing 128 Kibyte @ e0000 -- 100 % complete 
  2. 写入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升级步骤

  1. 擦除kernel分区
    # flash_erase /dev/mtd1 0 0 
    Erasing 128 Kibyte @ 7e0000 -- 100 % complete
  2. 写入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烧录时选用的配置

 

 

 

 至此,一切都明朗了。

 

posted @ 2022-11-29 16:58  闹闹爸爸  阅读(514)  评论(0编辑  收藏  举报