33-Openwrt nand flash生产烧录

openwrt编译生产的sysupgrade.bin文件是一个升级文件,无法直接提供给工厂进行nand flash烧录使用。因为flash的每一个page是由data+ecc组成的,烧录的时候需要一起烧录,但是sysupgade.bin是原始data内容,没有ecc。

1、ECC的大小和内容
1.1 flash page差异

第一步我们需要先确认主CPU支持哪些类型的nand flash,比如mt7621手册上的bootstrap写明,支持的不通page。

在这里插入图片描述

比如我们选择的是MX30LF1G28AD这个nand flash,芯片手册的features写明了是2048+128,所以硬件电路必须是10(1010)。
在这里插入图片描述

1.2 芯片差异

知道了flash的page大小之后,还有根据芯片手册的要求进行计算ECC内容,不同芯片描述不一样,比如mt7621的芯片要求,如下:

在这里插入图片描述

  • 原本flash芯片虽然是2048+64,但是mt7621要求的是512+16,所以实际每隔512字节需要填充16字节的ECC到后面。
  • 原本flash芯片虽然是2048+128,但是mt7621要求的是512+28,所以实际每隔512字节需要填充28字节的ECC到后面;到一个page的最后填充剩余的16字节FF。

但是mt7620的芯片就没有这个要求,就是按标准的flash page要求即可。

2、填充ECC

增对mt7621,mtk官方提供了BCH工具用来生产追加ecc后的文件。

命令如下:

USAGE: ./BCH ENC|DEC PAGE_SIZE SPARE_SIZE input_file output_file
SPARE_SIZE 64/128/224
PAGE_SIZE 2048/4096

example: ./BCH e 2048 64 roger_image linux_4bitECC.bin

对于mt760就是标准算法

example : ./mt7620nand 64 uboot.img

Note : 64 means spare area size, if the spare area size is 128, should change it 128
已知固件烧录的指令如下,那么固件升级的指令是什么? -----------------------固件上传----------------------- tftp 0x2000000 Sx45ZI_1.0_en_1.2.0_Build_250925_Rel.58924n_flash.bin -----------------------分区烧录----------------------- === loader === nand erase 0x0 0x40000;nand write 0x2000000 0x0 0x8000 === fdt === nand erase 0x40000 0x100000;nand write 0x2008000 0x40000 0x5000 === fdt_restore === nand erase 0x140000 0x100000;nand write 0x200D000 0x140000 0x5000 === uboot === nand erase 0x240000 0x100000;nand write 0x2012000 0x240000 0x5B000 === factory_info === nand erase 0x340000 0x80000;nand write 0x206D000 0x340000 0x124 === pt_table === nand erase 0x3C0000 0x180000;nand write 0x206D124 0x3C0000 0xF28 === pt_table_restore === nand erase 0x540000 0x180000;nand write 0x206E04C 0x540000 0xF28 === ubi1 === nand erase 0x6C0000 0x3000000;nand write 0x206EF74 0x6C0000 0xDE0000 -----------------------全部烧录----------------------- nand erase 0x0 0x40000;nand write 0x2000000 0x0 0x8000;nand erase 0x40000 0x100000;nand write 0x2008000 0x40000 0x5000;nand erase 0x140000 0x100000;nand write 0x200D000 0x140000 0x5000;nand erase 0x240000 0x100000;nand write 0x2012000 0x240000 0x5B000;nand erase 0x340000 0x80000;nand write 0x206D000 0x340000 0x124;nand erase 0x3C0000 0x180000;nand write 0x206D124 0x3C0000 0xF28;nand erase 0x540000 0x180000;nand write 0x206E04C 0x540000 0xF28;nand erase 0x6C0000 0x3000000;nand write 0x206EF74 0x6C0000 0xDE0000;
最新发布
09-29
<think>好的,用户问的是固件升级的指令是什么,已知他们提供了固件烧录的指令。我需要先仔细看一下用户给出的烧录步骤,然后分析出升级的步骤。 首先,用户分成了三个部分:固件上传、分区烧录和全部烧录。上传部分用了tftp命令将固件加载到内存地址0x2000000。分区烧录部分详细列出了各个分区的擦除和写入命令,比如loader、fdt、uboot等。全部烧录则是将所有分区的命令连在一起执行。 用户的问题是关于固件升级的指令。通常,固件升级可能只需要更新部分分区,而不是全部。比如,可能只需要更新内核和根文件系统,而其他分区如uboot或loader可能不需要改动。因此,我需要确定哪些分区的烧录是升级所必需的。 观察全部烧录的命令,它包含了所有分区的操作。但升级通常不会擦除所有分区,尤其是保留配置和用户数据。例如,在OpenWrt中,升级通常涉及更新内核和rootfs,而保留其他分区如factory_info或pt_table。但根据用户提供的分区情况,可能ubi1分区是主要的固件部分,因为它的大小是0x3000000,写入的数据从0x206EF74开始,可能包含系统的主要部分。 所以,升级指令可能只需要更新ubi1分区,因为其他分区如loader、fdt、uboot可能属于引导部分,不需要每次升级都更新。因此,正确的升级指令可能只包含擦除和写入ubi1分区的命令,以及可能的其他必要分区。 不过,需要确认用户的具体情况。比如,ubi1是否确实包含主要固件,或者是否需要同时更新其他分区。例如,有些系统可能将内核和rootfs分开为不同的分区,但这里ubi1可能是一个UBI卷,包含整个系统。因此,升级可能只需要更新这个分区。 因此,固件升级的指令应该是擦除ubi1分区,然后从内存地址0x206EF74写入到0x6C0000,长度0xDE0000。这样就能替换旧的固件内容,而无需修改其他引导分区。这样在升级时,保持引导部分不变,只更新系统部分,避免升级失败导致无法启动。 另外,用户可能还需要在升级后重启设备。因此,升级指令应包括烧录ubi1分区和重启命令。不过用户提供的烧录指令中没有重启的部分,可能需要补充,或者用户已经知道需要重启。 总结,升级指令应为: nand erase 0x6C0000 0x3000000; nand write 0x206EF74 0x6C0000 0xDE0000; 然后可能加上重启命令,如reset。但根据用户提供的指令,他们可能只需要烧录部分,所以回答中应给出正确的分区擦除和写入命令。</think>固件升级的指令通常仅需更新**主要固件分区**(如`ubi1`),而非全盘烧录。以下是基于你提供的烧录逻辑推导出的升级指令: --- ### **固件升级指令** ```bash nand erase 0x6C0000 0x3000000;nand write 0x206EF74 0x6C0000 0xDE0000 ``` --- ### **指令解析** 1. **擦除目标分区**: ```bash nand erase 0x6C0000 0x3000000 ``` - `0x6C0000`:`ubi1`分区的起始地址。 - `0x3000000`:分区大小(约48MB),确保覆盖整个固件数据。 2. **写入新固件**: ```bash nand write 0x206EF74 0x6C0000 0xDE0000 ``` - `0x206EF74`:内存中固件数据的起始地址(已通过`tftp`加载)。 - `0x6C0000`:目标分区的起始地址。 - `0xDE0000`:实际写入的数据长度(约14MB),需与固件大小匹配。 --- ### **升级逻辑说明** - **仅更新`ubi1`分区**: `ubi1`通常包含完整的系统镜像(如内核、根文件系统),升级时仅需覆盖此分区。 - **保留引导分区**: `loader`、`uboot`等引导相关分区无需重复烧录,避免升级失败导致设备无法启动。 - **兼容性设计**: 固件包设计为包含所有分区时,全盘烧录(`全部烧录`指令)适用于首次刷机;升级仅需更新核心部分。 --- ### **完整升级流程** ```bash # 1. 上传固件到内存 tftp 0x2000000 Sx45ZI_1.0_en_1.2.0_Build_250925_Rel.58924n_flash.bin # 2. 升级主要固件分区 nand erase 0x6C0000 0x3000000 nand write 0x206EF74 0x6C0000 0xDE0000 # 3. 重启设备 reset ``` --- ### **注意事项** 1. **校验数据长度**: 确保`nand write`的长度(`0xDE0000`)与固件实际大小一致,避免数据截断或溢出。 2. **备份关键分区**: 若升级失败,需通过`loader`或`uboot`恢复,确保引导分区未损坏。 3. **UBI卷管理**: 若使用UBI文件系统,升级后可能需要执行`ubiattach`和`ubimkvol`重建卷。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Creator_Ly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值