ZMP1107适配更大的SPI Nor-Flash并去掉EMMC
资料选择
官方提供两个ZMP110x评估板,相关配置如下:
- ZMP107+8M SPI Nor-Flash+4GEMMC:SPI Nor-Flash存放Uboot,Kernel等,EMMC存放Rootfs和应用demo等。
- ZMP106+16M SPI Nor-Flash:Uboot,Kernel、文件系统、应用demo等。
现在需要改成:ZMP1107使用16MB的SPI Nor-Flash用于Uboot,Kernel、文件系统、应用demo等,去掉EMMC。
在对比分析后决定在ZMP1106的SDK资料上修改成ZMP1107比较容易。
修改Uboot的SPI Nor-Flash的分区
- 16MB的SPI Nor-Flash分区规划(实际中应用中,如果4M的用户分区不够,可以继续扩展)
分区名 | 偏移(0x) | 大小(0x) | 初步大小 | 备注 |
---|
UBOOT | 0x0 | 0x40000(256K) | 146K | boot分区 | ENV | 0x40000 | 0x10000(64K) | 4K | 环境变量分区 | ENVBK | 0x50000 | 0x10000(64K) | 4K | 环境变量备份分区 | DTB | 0x60000 | 0x10000(64K) | 27K | 设备树分区 | KERNEL | 0x70000 | 0x280000(2560K) | 2197K | 内核分区 | LOGO | 0x2f0000 | 0x80000(512K) | 11K | 开机LOGO分区 | ROOTFS | 0x370000 | 0x800000(8192K) | 6776K | 文件系统分区 | WORK | 0xb70000 | 0x490000(4672KB) | 3K | 用户分区 |
- 进入uboot目录,按照上面分区修改zmp110x_evb.h文件:gedit include/configs/zmp110x_evb.h
#define MTDIDS_DEFAULT "nor0=spi0.0"
#define CONFIG_DEFAULT_MTDPARTS \
"mtdparts=mtdparts=spi0.0:256K@0x0(UBOOT),64K@0x40000(ENV),64K@0x50000(ENVBK),64K@0x60000(DTB),"\
"2560K@0x70000(KERNEL),512K@0x2f0000(LOGO),8192K@0x370000(ROOTFS),-@0xb70000(WORK)"
- 修改启动方式:Kernel,dtb,rootfs 都存放于 SPI Nor-Flash,这种情况下 rootfs 使用 squashfs 压缩自读文件系统,对应启动命令 boot_mtd。只修改其中的启动方式,其他默认。修改env.cfg文件:gedit envtool/zmp1106_smart_panel_nor.cfg
bootcmd run boot_mtd
- 根据不同的SPI Nor-Flash修改设备树:gedit arch/arm/boot/dts/zmp110x_spi_nor.dtsi
gd25q128: spi-norflash@2 {
compatible = "gd,gd25q128";
norflash-name = "gd25q128";
reg = <2>;
norflash-jedec-id = <0xc84018>;
norflash-ext-id = <0>;
norflash-sector-size = <0x10000>;
norflash-n-sectors = <256>;
norflash-flags = <0x18F8>;
rd_status_cmd = <0x05>, <0x35>, <0x15>;
wr_status_cmd = <0x01>, <0x31>, <0x11>;
wr_mode = <1>;
norflash-wr_flags = <2>;
norflash-b-wip = <0>;
norflash-b-wel = <1>;
norflash-b-bp0 = <2>;
norflash-b-bp1 = <3>;
norflash-b-bp2 = <4>;
norflash-b-bp3 = <5>;
norflash-b-bp4 = <6>;
norflash-b-srp0 = <7>;
norflash-b-srp1 = <8>;
norflash-b-qe = <9>;
norflash-b-cmp = <14>;
norflash-b-sus = <15>;
status = "disable";
};
- 修改板级设备树:gedit arch/arm/boot/dts/zmp1106_smart_panel.dts
&gd25q128 {
status = "okay";
};
- 检查uboot中是否有gd25q128的驱动: gedit drivers/mtd/spi/sf_probe.c ,已经有了,没有的话按照格式添加,细节参数参考芯片手册。
{
.jedec_id = 0xc84018, .ext_id = 0,
.b_wip = 0, .b_wel = 1, .b_bp0 = 2, .b_bp1 = 3,
.b_bp2 = 4, .b_bp3 = 5, .b_bp4 = 6, .b_srp0 = 7,
.b_srp1 = 8,.b_qe = 9, .b_lb = 10, .b_cmp = 14,
.b_sus = 15,
.read_sr = spi_flash_cmd_read_status,
.write_sr = spi_flash_gd25q128c_cmd_write_status,
},
{ "gd25q128", 0xc84018, 0, 64 * 1024, 256, SECT_4K|SFLAG_COM_STATUS2, 0,},
编译Uboot、Kernel等
注意:路劲使用自己主机的真实路径
- 依次执行以下命令编译 U-Boot,编译完成后会在 U-Boot 目录生成 u-boot.bin 文件
zlgmcu@ubuntu:~/u-boot$ export PATH=$PATH":/opt/arm-zlgmcu-linux-uclibcgnueabi/bin"
zlgmcu@ubuntu:~/u-boot$ export ARCH=arm
zlgmcu@ubuntu:~/u-boot$ export CROSS_COMPILE=arm-zlgmcu-linux-uclibcgnueabi-
zlgmcu@ubuntu:~/u-boot$ make distclean
zlgmcu@ubuntu:~/u-boot$ make zmp110x_evb_config
zlgmcu@ubuntu:~/u-boot$ make all -j4
- 在 Kernel 源码目录下,依次执行下面命令进行编译:
zlgmcu@ubuntu:~/kernel $ export PATH="/opt/arm-zlgmcu-linux-uclibcgnueabi/bin:"$PATH
zlgmcu@ubuntu:~/kernel $ export ARCH=arm
zlgmcu@ubuntu:~/kernel $ export CROSS_COMPILE=arm-zlgmcu-linux-uclibcgnueabi-
zlgmcu@ubuntu:~/kernel $ make O=../bd_kernel zmp1107_evb_defconfig
zlgmcu@ubuntu:~/kernel $ make O=../bd_kernel uImage dtbs modules -j4
zlgmcu@ubuntu:~/kernel $ make O=../bd_kernel INSTALL_MOD_PATH=../bd_modules modules_install -j4
下载系统
将上述编译文件放到burntool-v1.0.01-image目录下,使用USB对板子进行升级,burntool-v1.0.01-image工具需要进行如下配置。
分区配置如下:
spiflash配置如下:
确认保存后,长按boot健,给板子上电,看到进度条更新后松手即可下载系统。
注
w25q128和gd25q128兼容,但是ID不同,如果要修改,只需要将上面的chipID改成w25q128的0x1840ef,设备树中ID也改成0xef4018即可(注意大小端),我这里就是这样做的。
公众号
|