SSU_母片制作


1. Spinand母片制作

SPINAND因为会存在坏块的属性,所以不能直接从Flash Dump下来再烧录,需要使用公版提供的工具,按照以下步骤执行生成。

1.1. 获取母片制作工具包

点击下载:母片制作工具 v1.10


1.2. 基本工具文件介绍

  1. 运行工具: SstarMakeBin

运行环境:Linux

  1. 初始化文件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:              分区配置文件
  1. 烧录器的配置文件leap.def & snchk.def,运行后SstarMakeBin生成,供烧录器使用。 (leap烧录器用leap.def,其他烧录器一般用snchk.def)

  2. 用来制作母片的image文件以及对应的烧录脚本: images文件夹是从project\image\output\images下面的images拷贝过来的。

  3. 配置分区和image路径的脚本auto_update_spinand.txt

    auto_update_spinand.txt下dynpart这行的分区信息必须跟uboot下的mtdparts保持一致:


1.3. 制作步骤

  1. 编译image

  2. 将image包放到SstarMakebin目录下

  3. 不同版本兼容性修改

    SSU9383需要修改文件scripts/set_config: 红色框mtdparts=$(mtdparts) 改成 $(mtdparts)

  4. 修改SPINAND.INI

    按照上述配置说明修改,nni和pni可以不用指定完整路径,只要文件名即可

  5. 配置分区和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的路径

  6. 屏蔽烧录脚本中不支持的语句

    将image目录下scripts/[[set_partition.es中的以下两条语句屏蔽:

    scripts/[[cis.es 屏蔽:

  7. 运行母片制作工具

    在linux上运行./SstarMakeBin* -n SPINAND.ini(成功后如下图所示,否则为失败)

    同时在当前目录下会生成以下三个文件,nand.bin、leap.def、snchk.def。def为烧录器的配置文件,leap.def是leap烧录器使用,其他烧录器用snchk.def。nand.bin是烧录器烧录使用的程序。


1.4. 制作母片出错检查

  1. 如果是执行生成bin时有报错,先检查一下是否所执行的命令不支持,比如sd的升级脚本需要改为tftp的脚本形式

  2. 是否执行了一些save命令,重新保存了分区信息,导致分区信息与在auto_update_spinand.txt中指定的分区不一致

  3. 如果是烧录到板子上跑不起来,首先根据分区信息,检查生成的bin文件对应偏移地址处的文件信息是否正确,比如IPL的分区偏移为0x140000,则检查生成的bin文件地址0x140000位置处的文件内容是否为IPL文件的内容

  4. 检查烧录器烧录时oob区是否disable

  5. 用flash tool工具分别dump出板子上flash开始处、IPL分区偏移处、IPL_CUST分区偏移处、UBOOT分区偏移处、kernel分区偏移处的部分文件对比是否与烧录的bin文件一致


1.5. 烧录器参考配置(分区配置文件)


1.5.1. snchk.def分区配置文件说明(常用于非leap烧录器)

如下图:def格式是大端存储的

  1. 使用二进制打开文件,每一行代表一个分区的描述

  2. 红框中的分区描述:

  3. 红框1中,4个字节描述分区的起始block,如第一行00 00 00 00,代表的是起始位置为第0个block

  4. 红框2中,4个字节描述分区的结束block,如第一行09 00 00 00,代表的是结束位置为第9个block(包含第9block)

  5. 红框3中,4个字节描述分区的实际有效数据占用的block数,如第一行0A 00 00 00,代表的是占用了10个block

    结束block – 起始block >= 有效数据block


1.5.2. leap.def分区配置文件说明(针对leap烧录器)

如下图:def格式是大端存储的

  1. 除去第一行跟最后一行,每一行就是代表一个分区的描述

  2. 第一行是leap的头信息,烧录器厂商可以自行判断是否需要,不需要可去掉(因烧录器而异)

  3. 每行的前4个字节为特有标记,各烧录器厂家自行判断是否需要,不需要可去掉(因烧录器而异)

  4. 红框中的分区描述:

  5. 红框1中,4个字节描述分区的起始block,如第一行00 00 00 00,代表的是起始位置为第0个block

  6. 红框2中,4个字节描述分区的结束block,如第一行09 00 00 00,代表的是结束位置为第9个block(包含第9block)

  7. 红框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. 附件工具

emmcnize.zip

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。