Skip to main content

SPI Nand

一 硬件环境

以RD_AD100_EVB_V1.0开发板为例, 从MSC0启动(tf卡对应控制器)进行flash烧录,烧录完成从SFC0启动

1

二 卡启动镜像制作

2.1 sd卡烧录配置

打开iconfigtool配置页面, 使用ad100_mmc0_5.10_sd_card_burn_sfc_nand_dtb_defconfig配置

2

3

升级脚本路径可修改

4

bhu@bhu-PC:~/work/buildroot/buildroot_patch/rootfs_config/file/sdcard_update$ ls -l
总用量 28
-rwxr-xr-x 1 bhu bhu 7172 419 14:53 S99_510_quickstart_sdcard_update #快启脚本,增加了rtos分区
-rwxr-xr-x 1 bhu bhu 6941 419 14:53 S99_510_sdcard_update #默认脚本
-rwxr-xr-x 1 bhu bhu 9515 419 14:53 S99sdcard_update

烧录脚本只是参考demo, 客户需要根据实际使用分区, 对脚本进行修改

2.2 Nand分区配置

可根据实际需求, 修改flash分区大小及个数,位置位于kernel/kernel/module_drivers/dts/ad100_module_base_mmc0_bootargs.dts

5

卡烧录是按分区擦除和分区烧录, 所以dts文件的分区信息必须和nand flash实际使用分区一致

修改完后, 保存编译

bhu@bhu-PC:~/ad100/build$ make clean                   #第一次编译不需要make clean
bhu@bhu-PC:~/ad100/build$ make ad100_mmc0_5.10_sd_card_burn_sfc_nand_dtb_defconfig
bhu@bhu-PC:~/ad100/build$ make

编译后生成固件如下:

bhu@bhu-PC:~/ad100/build$ cd output/
bhu@bhu-PC:~/ad100/build/output$ ls -l
总用量 9924
-rw-r--r-- 1 bhu bhu 15935 613 14:05 ad100_module_base_mmc0_bootargs.dtb
-rw-r--r-- 1 bhu bhu 4853760 613 14:05 rootfs.squashfs
-rw-r--r-- 1 bhu bhu 215544 613 14:05 u-boot-with-spl-mbr-gpt.bin
-rw-r--r-- 1 bhu bhu 5070912 613 14:05 xImage

三 TF卡写入启动镜像

offset需要与分区表一致, 位于bootloader/uboot-x2000/board/ingenic/ad100_base/partitions.tab

这里是卡启动的分区信息, 用于sd卡固件启动, 与nand分区不相关

property:
disk_size = 3728m
gpt_header_lba = 512
custom_signature = 0

partition:
#name = start, size, fstype
xboot = 0m, 1m,
kernel = 1m, 8m, EMPTY
dtb = 9m, 1m, EMPTY
rootfs = 10m, 100m, LINUX_FS
kernel2 = 110m, 8m, EMPTY
dtb2 = 118m, 1m, EMPTY
rootfs2 = 119m, 100m, LINUX_FS
ota = 219m, 1m, EMPTY
userdata = 220m, 3508m, LINUX_FS

#fstype could be: LINUX_FS, FAT_FS, EMPTY

使用读卡器将sd卡插入电脑, 使用 ls /dev/sd* 命令查看所有的磁盘设备, 找到sd卡对应设备路径

sudo dd if=/dev/zero of=/dev/sdb bs=4M status=progress            #格式化sd卡设备
sync
#重新插拔sd卡确认是否只有/dev/sdb节点, 没有/dev/sdb1 .....

sudo dd if=u-boot-with-spl-mbr-gpt.bin of=/dev/sdb
sudo dd if=xImage of=/dev/sdb bs=512 seek=2048 #与uboot目录中的partitions.tab分区一致, offset 1MB
sudo dd if=ad100_module_base_mmc0_bootargs.dtb of=/dev/sdb bs=512 seek=18432 #与uboot目录中partitions.tab分区一致, offset 9MB
sudo dd if=rootfs.squashfs of=/dev/sdb bs=512 seek=20480 #与uboot目录中partitions.tab分区一致, offset 10M
sync

四 Nand烧录镜像制作

4.1 nand镜像编译

以基础配置ad100_nand_5.10_defconfig为例

bhu@bhu-PC:~/ad100/build$ make clean                   #第一次编译不需要make clean
bhu@bhu-PC:~/ad100/build$ make ad100_nand_5.10_defconfig
bhu@bhu-PC:~/ad100/build$ make

4.2 合成带有分区信息的启动uboot镜像

6

7

此处分区信息需要与2.2章节的分区信息对应

8

AD100参数偏移是0x5800, 只勾选uboot把uboot和分区信息打包到一起

点击“合并镜像”按钮,在选择的镜像同级目录下会生成 image.bin 文件

五 TF卡拷贝nand镜像

查看tf卡分区

bhu@bhu-PC:~/Desktop/nand$ sudo parted  -s  /dev/sdb print
请输入密码:
验证成功
Error: The backup GPT table is corrupt, but the primary appears OK, so that will be used.
Warning: Not all of the space available to /dev/sdb appears to be used, you can fix the GPT to use all of the space (an extra 54698975 blocks) or continue with the current setting?
Model: Generic- SD/MMC (scsi)
Disk /dev/sdb: 31.9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 9437kB 8389kB kernel msftdata
2 9437kB 10.5MB 1049kB dtb msftdata
3 10.5MB 115MB 105MB rootfs msftdata
4 115MB 124MB 8389kB kernel2 msftdata
5 124MB 125MB 1049kB dtb2 msftdata
6 125MB 230MB 105MB rootfs2 msftdata
7 230MB 231MB 1049kB ota msftdata
8 231MB 3909MB 3678MB userdata msftdata

在userdata分区即/dev/sdb8创建ext4文件系统

bhu@bhu-PC:~/Desktop/sd_card_burn_nand_bin/sb_card_burn_sfc_nand$ sudo mkfs.ext4 /dev/sdb8

将nand镜像全部拷贝到userdata分区, 对应/dev/sdb8

bhu@bhu-PC:~/ad100/build/output$ mkdir userdata
bhu@bhu-PC:~/ad100/build/output$ sudo mount /dev/sdb8 userdata/
bhu@bhu-PC:~/ad100/build/output$ sudo chmod 777 userdata/
bhu@bhu-PC:~/ad100/build/output$ mkdir -p userdata/sdcard_update/
bhu@bhu-PC:~/ad100/build/output$ touch userdata/sdcard_update/enable_update //2.1章节脚本会判断该文件是否存在,才会继续
bhu@bhu-PC:~/ad100/build/output$ cp image.bin userdata/sdcard_update/uboot.bin //2.1章节脚本中烧录的uboot.bin
bhu@bhu-PC:~/ad100/build/output$ cp xImage userdata/sdcard_update/ //2.1章节脚本中烧录的xImage
bhu@bhu-PC:~/ad100/build/output$ cp rootfs.squashfs userdata/sdcard_update/ //2.1章节脚本中烧录的rootfs.squashfs
bhu@bhu-PC:~/ad100/build/output$ sync
bhu@bhu-PC:~/ad100/build/output$ sudo umount userdata/

六 卡启动烧录flash

将卡插入开发板, 上电(msc0启动)查看串口打印, 可以看见系统烧录打印, 重新启动(SFC0启动) ,可以看见系统正常启动

Starting adb ...
install_listener('tcp:5037','*smartsocket*')
[ 1.135775] read descriptors
[ 1.136005] read strings
mtd erase kernel /dev/mtd1
mtd write kernel /dev/mtd1 /usr/data/sdcard_update/xImage
sh: write error: No such device
[ 2.157479] dwc2 13500000.otg: bound driver configfs-gadget
[ 2.350660] dwc2 13500000.otg: new device is high-speed
[ 2.434204] dwc2 13500000.otg: new device is high-speed
[ 2.498456] dwc2 13500000.otg: new address 25
mtd erase rootfs /dev/mtd2
mtd write rootfs /dev/mtd2 /usr/data/sdcard_update/rootfs.squashfs
mtd erase uboot /dev/mtd0
mtd write uboot /dev/mtd0 /usr/data/sdcard_update/uboot.bin
mtd write image ok!