SSU_母片制作
1. Spinand母片制作¶
SPINAND因为会存在坏块的属性,所以不能直接从Flash Dump下来再烧录,需要使用公版提供的工具,按照以下步骤执行生成。
1.1. 获取母片制作工具包¶
点击下载:母片制作工具 v1.10
1.2. 基本工具文件介绍¶
- 运行工具: SstarMakeBin
运行环境:Linux
-
初始化文件SPINAND.INI(spinand)
文件基本内容如下图所示,需要根据以下配置说明修改:
部分配置说明如下:
root_directory: 根目录,一般不用修改 image_directory: 设置image的位置,记得别忘了/号,如image/ script_file: 第一个要执行的script文件,默认是auto_update_spinand.txt outpath: bin输出路径 nandtype: 设置nand类型,如果是pnand类型为PNAND,如果是spinand类型为SPINAND nandid: flash的id号,需要根据实际flash的datasheet来填写 env_type: 一般设置为NANDRAW env_part: 环境变量分区的名字,要与mtdparts中的环境变量分区名字一致,一般是ENV nni: pnand使用.nni,spinand使用.sni文件 pni: 分区配置文件
-
烧录器的配置文件
leap.def & snchk.def
,运行后SstarMakeBin生成,供烧录器使用。 (leap烧录器用leap.def,其他烧录器一般用snchk.def) -
用来制作母片的image文件以及对应的烧录脚本: images文件夹是从
project\image\output\images
下面的images拷贝过来的。 -
配置分区和image路径的脚本
auto_update_spinand.txt
auto_update_spinand.txt
下dynpart这行的分区信息必须跟uboot下的mtdparts保持一致:
1.3. 制作步骤¶
-
编译image
-
将image包放到SstarMakebin目录下
-
不同版本兼容性修改
SSU9383需要修改文件scripts/set_config: 红色框
mtdparts=$(mtdparts)
改成$(mtdparts)
-
修改SPINAND.INI
按照上述配置说明修改,nni和pni可以不用指定完整路径,只要文件名即可
-
配置分区和image脚本路径
→在板端的uboot下,执行printenv命令,打印出 mtdparts分区的设置,并拷贝到auto_update_spinand.txt中.
chip中的分区配置如下图:
auto_update_spinand.txt中分区设置如下图:
→确认auto_update_spinand.txt中的estar images/auto_update.text的路径是否要修改,estar执向的路径一般是image中auto_update.txt的路径
-
屏蔽烧录脚本中不支持的语句
将image目录下scripts/[[set_partition.es中的以下两条语句屏蔽:
scripts/[[cis.es 屏蔽:
-
运行母片制作工具
在linux上运行./SstarMakeBin* -n SPINAND.ini(成功后如下图所示,否则为失败)
同时在当前目录下会生成以下三个文件,nand.bin、leap.def、snchk.def。def为烧录器的配置文件,leap.def是leap烧录器使用,其他烧录器用snchk.def。nand.bin是烧录器烧录使用的程序。
1.4. 制作母片出错检查¶
-
如果是执行生成bin时有报错,先检查一下是否所执行的命令不支持,比如sd的升级脚本需要改为tftp的脚本形式
-
是否执行了一些save命令,重新保存了分区信息,导致分区信息与在auto_update_spinand.txt中指定的分区不一致
-
如果是烧录到板子上跑不起来,首先根据分区信息,检查生成的bin文件对应偏移地址处的文件信息是否正确,比如IPL的分区偏移为0x140000,则检查生成的bin文件地址0x140000位置处的文件内容是否为IPL文件的内容
-
检查烧录器烧录时oob区是否disable
-
用flash tool工具分别dump出板子上flash开始处、IPL分区偏移处、IPL_CUST分区偏移处、UBOOT分区偏移处、kernel分区偏移处的部分文件对比是否与烧录的bin文件一致
1.5. 烧录器参考配置(分区配置文件)¶
1.5.1. snchk.def分区配置文件说明(常用于非leap烧录器)¶
如下图:def格式是大端存储的
-
使用二进制打开文件,每一行代表一个分区的描述
-
红框中的分区描述:
-
红框1中,4个字节描述分区的起始block,如第一行00 00 00 00,代表的是起始位置为第0个block
-
红框2中,4个字节描述分区的结束block,如第一行09 00 00 00,代表的是结束位置为第9个block(包含第9block)
-
红框3中,4个字节描述分区的实际有效数据占用的block数,如第一行0A 00 00 00,代表的是占用了10个block
结束block – 起始block >= 有效数据block
1.5.2. leap.def分区配置文件说明(针对leap烧录器)¶
如下图:def格式是大端存储的
-
除去第一行跟最后一行,每一行就是代表一个分区的描述
-
第一行是leap的头信息,烧录器厂商可以自行判断是否需要,不需要可去掉(因烧录器而异)
-
每行的前4个字节为特有标记,各烧录器厂家自行判断是否需要,不需要可去掉(因烧录器而异)
-
红框中的分区描述:
-
红框1中,4个字节描述分区的起始block,如第一行00 00 00 00,代表的是起始位置为第0个block
-
红框2中,4个字节描述分区的结束block,如第一行09 00 00 00,代表的是结束位置为第9个block(包含第9block)
-
红框3中,4个字节描述分区的实际有效数据占用的block数,如第一行0A 00 00 00,代表的是占用了10个block
结束block – 起始block >= 有效数据block
1.5.3. 烧录器配置信息¶
- 应用产品信息
CPU品牌/型号 | 软件系统 |
---|---|
Sigmastar | Linux |
-
镜像文件中是否包含Spare(OOB)数据:
☐ 有Spare(OOB)数据: _____字节
√ 无Spare(OOB)数据
-
坏块管理模式(是否有分区)
☐ 跳过方式: Skip IB
√ 分区方式: Multiple Partitions (with skip IB)
需要提供分区表文件(分区文件参考1.6.2说明)
-
是否使用On-chip ECC(仅带有片内ECC功能的Flash)
☐ 不使用On-chip ECC
最大允许错误位参数: _____(bits) / _____(bytes)
镜像文件中必须包含Spare(OOB)数据
√ 使用On-chip ECC
-
坏块标记
标记位置(地址): 800h
坏块标记数据: 00h
1.5.4. 烧录器配置参考¶
本章节内容仅供参考,不同烧录器配置可能不同。
使用针对GD5F1GQ4UBYIG的flash配置,参考如下:
2. SPINOR母片制作¶
因为SPINOR Flash不存在坏块的情况,所以SPINOR Flash可以直接从一个确认完整的Flash中完整dump下来直接做二次烧录,母片制作较SPINAND简单很多,这里使用Flash_Tool去dump并烧录说明(实际使用过程中可自行使用烧录器也可)
2.1. 获取SSD对应的Flash_Tool.exe¶
2.2. 准备一个干净的Flash¶
假设是在用的Flash,则接用Flash_Tool去做全chip擦除,擦除操作如下:
a. 开机进入uboot控制台(如果可以),在uboot控制台输入”debug”,并断开串口终端工具,如下图:
b. 使用Flash_Tool擦除整个Flash,如下图Flash_Tool连接成功后切到Erase界面,填写好Start-End Addr擦除范围后(按全Flash大小算),点击Erase等待ok即可
2.3. 烧录image¶
参照烧录文档,选择适合的方式将image烧录到干净的这块NorFlash上(烧录步骤这里省略,如有需要参考烧录相关文档即可)
2.4. Dump flash¶
使用Flash_Tool工具dump在干净状态烧录成功的Flash,生成的bin即可作为母片使用,dump操作如下,等待dump成功即可(注意dump的地址要填全flash范围)
2.5. 验证母片的正确性¶
验证母片的正确性,可以使用Flash_Tool从Flash的0地址按顺序烧录(烧录时间可能比较久),烧录成功后开机看看是否正常即可
3. EMMC使用烧录器空片烧录¶
3.1. 烧入BOOT_PART.bin¶
将emmc分区切至boot0分区(或boot1),然后将boot.bin文件烧入到0地址处。
3.2. 制作system母片镜像¶
使用emmcnize工具制作母片镜像,用于把kernel、rootfs、文件系统、用户数据、环境变量等镜像合并成一个可以直接通过烧录器烧录到空片的镜像。
3.2.1. 环境变量镜像¶
把需要设置的环境变量按照uboot printenv命令打印出来的格式写入到一个txt文件,例如:
#env.txt baudrate=115200 boot_part=01 bootargs=console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait rootfstype=ext4 rw init=/linuxrc LX_MEM=0x1000000000,0x20000000 mma_heap=mma_heap_name0,miu=0,sz=0x10000000,max_start_off=0x1000000000 mma_heap=mma_heap_fb,miu=0,sz=0x1000000,max_end_off=0x1100000000 mma_memblock_remove=1 cma=16M nohz=off mmap_reserved=riscv,miu=0,sz=0x1C0000,max_start_off=0x06440000,max_end_off=0x06600000 no_console_suspend mtdparts= bootcmd=dcache on ; emmc read.p 0x23000000 kernel 0xA00000; emmc read.p 0x26D00000 DTB 0x40000; bootm 0x23000000 - 0x26D00000; dcache on ; bootm 0x23000000 bootdelay=0 ethact=gmac0 fdt_high=0xffffffffffffffff fdtcontroladdr=2bb6e730 fileaddr=21000000 filesize=40000 mem=196608k partconf=02 stderr=serial stdin=serial stdout=serial
boot编译后在tool目录下有一个mkenvimage(boot/tools/mkenvimage)工具:
执行./mkenvimage -s 0x1000 -o env.bin env.txt
生成环境变量镜像。
3.2.2. UDA分区配置文件¶
假设当前分区如下:
SigmaStar # emmc part Partition Map for MMC device 0 -- Partition Type: EMMC Type Name Number BlkCnt @ Start Capacity RISCVFW 1 1024 @ 615424 (512k) kernel 2 20480 @ 616448 ( 10M) DTB 3 1024 @ 636928 (512k) DTBO 4 1024 @ 637952 (512k) rootfs 5 409600 @ 638976 (200M) MISC 6 20480 @ 1048576 ( 10M) miservice 7 614400 @ 1069056 (300M) customer 8 2138112 @ 1683456 ( 1G)
则通过emmcnize工具来读取part.ini文件,并最终建立分区表和打包镜像。配置文件格式如下:
[env] image=env.bin vol_id=0 vol_size=0x12C31000 vol_name="" [RISCVFW-volume] image=riscvfw vol_id=1 vol_size=0x80000 vol_name=RISCVFW [kernel-volume] image=kernel vol_id=2 vol_size=0xA00000 vol_name=kernel [DTB-volume] image=dtb vol_id=3 vol_size=0x80000 vol_name=DTB [DTBO-volume] image=dtbo vol_id=4 vol_size=0x80000 vol_name=DTBO [rootfs-volume] image=rootfs.ext4 vol_id=5 vol_size=0xC800000 vol_name=rootfs [MISC-volume] image=misc.fwfs vol_id=6 vol_size=0xA00000 vol_name=MISC [miservice-volume] image=miservice.ext4 vol_id=7 vol_size=0x12C00000 vol_name=miservice [customer-volume] image=customer.ext4 vol_id=8 vol_size=0x41400000 vol_name=customer
image=XX,定义分区镜像名,必须与已有镜像名相同。
vol_id=X,定义分区id,是唯一ID即可,目前仅用于标识而已(不做分区排序使用)。
vol_size=XX,定义分区大小(Bytes单位),必须不小于对应镜像大小。
vol_name=XX,定义分区名,uboot下通过emmc part看到的分区名。
[XXX-volume] section是真正的用户分区,它们的image、vol_size、vol_name都可以根据实际分区情况进行更改。vol_id从1开始编号,最大支持63个分区。
[XXX-volume] section请按照实际的分区表顺序来排列。
3.2.3. 打包母片镜像¶
把需要打包的镜像(env.bin、kernel、rootfs.ext4、data.ext4等)及UDA分区配置文件(part.ini)与emmcnize工具放在同一个目录下,指定配置文件作为输入,指定输出文件,格式:./emmcnize <input ini file> <output image file>
,例如:
./emmcnize part.ini image.bin
其中part.ini为分区配置文件,image.bin为输出的完整镜像。
正常情况下,完成操作会打印如下所述的“done”信息。
parsing section "data-volume" volume id: 4 volume size: 67108864 bytes volume name: data write to volume4 from image file customer.ext4 done
若配置文件指定了某个文件,但是没有放入指定镜像文件,那么会提示空文件,不影响完整镜像的生成,但是生成的镜像不会包含需要部分镜像可能导致无法启动,需要注意。
3.3. 烧入母片镜像image.bin¶
将emmc分区切至UDA分区,然后将image.bin(上一节生成)烧入到0地址处。
3.4. 附件工具¶
3.5. 说明¶
part.ini文件中env的size比实际env.bin的size大,这是因为母片工具制作母片时会从env的起始地址0x278开始补充镜像文件,直至补充完当前分区的size,如果按照env.bin的实际size烧录,0x278*512+0x1000=327680 byte=640 blk就会是用户分区数据开始存储的地方,这与我们uboot下读取用户数据的实际起始地址不同,uboot下读取相应数据的地址如下图:
如上图,用户分区数据起始地址是615424,为了保证uboot下可以正确读到相应的数据,所以part.ini中env的size需要设置为 615424-0x278=614792 blk=0x12C31000 byte。