启动开发指南
1. 概述
1.1 编写目的
主要介绍SpacemiT的刷机 启动流程和自定义配置,以及uboot、opensbi相关的驱动开发,基本调试方法,方便开发者快速上手或者二次开发。
1.2 适用范围
本文档适用于SpacemiT的K1系列SOC。
1.3 相关人员
- 刷机启动开发工程师
- 内核开发工程师
1.4 文档结构
本文档先介绍刷机启动相关的流程和配置方式,然后再介绍uboot/opensbi的编译配置和驱动开发调试,最后记录一些常见的问题处理
2. 刷机启动
本章节介绍刷机和启动相关的配置以及实现原理,并提供自定义刷机、启动的方式。 注意,刷机与启动是相互关联的,如果需要对刷机做自定义配置,启动可能也需要做相关的调整,反之亦然。
2.1 固件布局
K1系列SOC常见的固件布局有以下三种
-
emmc 1.如上图所示,emmc有boot0和user_data_area两个区域。这是它的存储特点决定的,不做多展开。 2.bootinfo_emmc.bin和FSBL.bin存储在boot0区域。user_data_area区域用gpt管理分区表,user区域的fsbl分区里面实际上没有内容。brom启动后会从boot0区域加载bootinfo_emmc.bin和FSBL.bin。
-
sdcard 1.类似emmc,但sdcard只有user_data_area区域。bootinfo_sd.bin占用前面80 byte,gpt表在1 blk位置。
-
nor+ssd
1.包含nor上固件(fsbl+opensbi+uboot),ssd上固件(bootfs+rootfs) 2.也支持nor+emmc等blk设备,默认已适配。假如没有插入ssd,只有nor+emmc,拨码开关拨向nor启动,则刷机启动为nor+emmc 3.仅支持pcie0接口插入的ssd作为刷机启动介质,如果ssd插入非pcie0接口,则仅作为存储介质。 4.如果由taitanflaser工具刷机,ssd上的分区表实际会包含fsbl/ubot/opensbi,但分区内容没有产生作用。这个是由实际的分区表决定
2.2 刷机流程和配置
以下内容包含的刷机、烧写为同一个概念。卡量产本质上也是刷机,只是数据来源于sd卡。 卡量产和卡启动为两个不同的概念,卡启动是将镜像烧写到sdcard里面,从sd卡里面启动系统。
2.2.1 刷机流程
刷机流程实际上是通过fastboot协议,将PC端的镜像传输到机子,然后通过mmc/mtd/nvme等接口写入到对应的存储介质。 完整的刷机流程包括进入uboot fastboot 模式,镜像传输,存储介质设备检测,创建gpt表,写入数据到存储介质等内容。
2.2.1.1 uboot fastboot模式
本平台刷机通讯协议是基于fastboot协议,并做了一些自定义扩展,所有实际的刷机行为都是基于uboot fastboot模式下开展。 进入uboot fastboot模式后,通过PC端执行fastboot devices能检测到设备(需要配置PC fastboot环境)
~$ fastboot devices
c3bc939586f0 Android Fastboot
以下介绍进入uboot fastboot模式的三种方法。 1.通过板子上按键组合fel键+reset键进入brom-fastboot,然后在上位机(PC)执行以下命令,板子进入uboot刷机交互 界面。brom-fastboot仅用于加载启动uboot fastboot
fastboot stage factory/FSBL.bin
fastboot continue
#sleep wait for uboot ready
#linux环境下
sleep 1
#windows环境下
#timeout /t 1 >null
fastboot stage u-boot.itb
fastboot continue
2.对于设备已经启动到os,可通过上位机(PC)运行adb reboot bootloader,板子进入uboot刷机交互界面。(某些固件会去掉adb功能,该方式并不是通用的方式) 3.板子启动时通过串口长按s键进入uboot shell,然后串口执行fastboot 0进入uboot刷机交互界面。
以下介绍各种组合介质的刷机命令,其中brom可根据boot pin切换不同的启动介质(nor/nand/emmc),这个依赖硬件设计,详情请查看硬件参考设计。
2.2.1.2 emmc刷机
- emmc刷机流程
对于emmc的刷机流程如下,前面部分是从brom-fastboot启动到uboot-fastboot模式,下面其他的介质也一样
fastboot stage factory/FSBL.bin
fastboot continue
#sleep to wait for uboot ready
#linux环境下
sleep 1
#windows环境下
#timeout /t 1 >null
fastboot stage u-boot.itb
fastboot continue
fastboot flash gpt partition_universal.json
#bootinfo_emmc.bin内容无实际作用,请参考FAQ 6.4章节。但刷写步骤还需执行
fastboot flash bootinfo factory/bootinfo_emmc.bin
fastboot flash fsbl factory/FSBL.bin
fastboot flash env env.bin
fastboot flash opensbi fw_dynamic.itb
fastboot flash uboot u-boot.itb
fastboot flash bootfs bootfs.img
fastboot flash rootfs rootfs.ext4
对于emmc,bootinfo_emmc.bin的内容固化在uboot代码里面,这是为了用同一份partition_universal.json分区表兼容卡启动的制作等 。且bootinfo_emmc.bin和fsbl.bin实际上是写入到emmc的boot0分区
- emmc分区表配置
分区表保存在buildroot-ext/board/spacemit/k1/partition_universal.json。其中bootinfo不作为一个显式的分区,用于保存启动介质相关的信息。
{
"version": "1.0",
"format": "gpt",
"partitions": [
{
"name": "bootinfo",
"offset": "0",
"size": "80B",
"image": "factory/bootinfo_sd.bin"
},
{
"name": "fsbl",
"offset": "256K",
"size": "256K",
"image": "factory/FSBL.bin"
},
{
"name": "env",
"offset": "512K",
"size": "128K"
},
{
"name": "opensbi",
"offset": "1M",
"size": "1M",
"image": "opensbi.itb"
},
{
"name": "uboot",
"offset": "2M",
"size": "2M",
"image": "u-boot.itb"
},
{
"name": "bootfs",
"offset": "4M",
"size": "128M",
"image": "bootfs.img"
},
{
"name": "rootfs",
"size": "-"
}
]
}
2.2.1.3 nor+blk设备刷机
- nor+blk刷机流程
k1支持nor+ssd/emmc等blk设备的组合刷机启动,且为自适应的方式,如果同时存在ssd和emmc,默认烧写到ssd
fastboot stage factory/FSBL.bin
fastboot continue
#sleep wait for uboot ready
#linux环境下
sleep 1
#windows环境下
#timeout /t 1 >null
fastboot stage u-boot.itb
fastboot continue
#刷spi nor
fastboot flash mtd partition_2M.json
fastboot flash bootinfo factory/bootinfo_spinor.bin
fastboot flash fsbl factory/FSBL.bin
fastboot flash env env.bin
fastboot flash opensbi fw_dynamic.itb
fastboot flash uboot u-boot.itb
#刷block设备
#刷机工具会根据实际的分区表烧写镜像,所以对于nor+blk,blk设备的fsbl/uboot/等分区并没有实际作用
fastboot flash gpt partition_universal.json
fastboot flash bootfs bootfs.img
fastboot flash rootfs rootfs.ext4
- nor+blk分区表配置
nor分区表,如buildroot-ext/board/spacemit/k1/partition_2M.json。对于nand/nor设备,分区表都是以partiton_xM.json命名,且需要根据实际的flash容量重命名,否则会导致刷机时找不到对应的分区表。 nor/nand的分区表会向最小容量兼容,比如nor的介质容量为8MB,刷机包里面只有partition_2M.json,则会匹配到partition_2M.json的分区表。
对于分区表配置,mtd存储介质(nand/nor flash)会以partition_2M.json等容量的形式表示,blk设备(包括emmc/sd/ssd等)都以partition_universal.json命名。
Nor flash分区表修改:
1.分区起始地址和size默认以64KB对齐(对应erasesize 为64KB)。
2.如果起始地址和size需要更改成4KB对齐,则要开启uboot的编译配置CONFIG_SPI_FLASH_USE_4K_SECTORS
//buildroot-ext/board/spacemit/k1/partition_2M.json
{
"version": "1.0",
"format": "mtd",
"partitions": [
{
"name": "bootinfo",
"offset": "0",
"size": "128K",
"image": "factory/bootinfo_spinor.bin"
},
{
"name": "fsbl",
"offset": "128K",
"size": "256K",
"image": "factory/FSBL.bin"
},
{
"name": "env",
"offset": "384K",
"size": "64K"
},
{
"name": "opensbi",
"offset": "448K",
"size": "192K",
"image": "fw_dynamic.itb"
},
{
"name": "uboot",
"offset": "640K",
"size": "-",
"image": "u-boot.itb"
}
]
}
ssd分区表。对于blk设备的分区表,都是partition_universal.json。此时bootinfo、fsbl、env、opensbi、uboot等分区以及里面的数据不会影响到正常的启动。
//buildroot-ext/board/spacemit/k1/partition_universal.json
{
"version": "1.0",
"format": "gpt",
"partitions": [
{
"name": "bootinfo",
"offset": "0K",
"size": "512",
"image": "factory/bootinfo_sd.bin",
"holes": "{\"(80;512)\"}"
},
{
"name": "fsbl",
"offset": "128K",
"size": "256K",
"image": "factory/FSBL.bin"
},
{
"name": "env",
"offset":"384K",
"size": "64K",
"image": "env.bin"
},
{
"name": "opensbi",
"size": "384K",
"image": "fw_dynamic.itb"
},
{
"name": "uboot",
"size": "2M",
"image": "u-boot.itb"
},
{
"name": "bootfs",
"offset": "4M",
"size": "256M",
"image": "bootfs.img",
"compress": "gzip-5"
},
{
"name": "rootfs",
"offset": "260M",
"size": "-",
"image": "rootfs.ext4",
"compress": "gzip-5"
}
]
}
2.2.1.4 nand 刷机启动
- nand刷机流程
k1支持nand刷机启动。但由于nand与nor共用同一个spi接口,只能选择其中一个 方案,默认支持nor启动。 如需支持nand刷机启动,请参考刷机启动中的nand启动配置章节,配置nand启动。
fastboot stage factory/FSBL.bin
fastboot continue
#sleep wait for uboot ready
#linux环境下
sleep 1
#windows环境下
#timeout /t 1 >null
fastboot stage u-boot.itb
fastboot continue
fastboot flash mtd partition_64M.json
fastboot flash bootinfo factory/bootinfo_spinand.bin
fastboot flash fsbl factory/FSBL.bin
fastboot flash env env.bin
fastboot flash opensbi fw_dynamic.itb
fastboot flash uboot u-boot.itb
fastboot flash user-bootfs bootfs.img
fastboot flash user-rootfs rootfs.img
nand上文件系统管理依赖ubifs,其中bootfs和rootfs分区制作方法如下,
#制作bootfs.img
mkfs.ubifs -F -m 2048 -e 124KiB -c 8124 -x zlib -o output/bootfs.img -d input_bootfs/
#制作rootfs.img
mkfs.ubifs -F -m 2048 -e 124KiB -c 8124 -x zlib -o output/rootfs.img -d input_rootfs/
#input_bootfs和input_rootfs应该存放bootfs和rootfs中的文件
#例如对于bootfs,应该放入如下文件Image.itb、env_k1-x.txt、k1-x.bmp
#不同的nand需要修改对应的参数,以下是一些参数说明,具体可查看mkfs.ubifs的用法
-m 2048:设置最小输入/输出单元大小为 2048 字节(2 KiB),要与NAND Flash 的页大小相匹配。
-e 124KiB:设置逻辑擦除块的大小为 124 KiB(千字节),这应小于实际的物理擦除块的大小,以留出空间用于 UBI 的管理结构。
-c 8124:设置最大逻辑擦除块的数量为 8124,这个数字限制了文件系统的最大大小,基于逻辑擦除块的大小和数量计算。
-x zlib:设置压缩类型为 zlib,这将在文件系统上对数据进行 zlib 压缩。
-o output/ubifs.img:指定输出文件名,将生成的 UBIFS 文件系统镜像保存为 output/ubifs.img。
-d input/:指定源目录为 input/,mkfs.ubifs 将会把这个目录下的文件和文件结构创建成 UBIFS 文件系统镜像。
同时,本平台也支持nand+blk设备启动方式,刷机命令可参考nor+blk设备刷机章节。
- nand分区表配置
如256MB容量的nand,分区表为partition_256M.json
//buildroot-ext/board/spacemit/k1/partition_64M.json
{
"version": "1.0",
"format": "mtd",
"partitions": [
{
"name": "bootinfo",
"comment": "private partition, should not overrided it",
"offset": "0",
"size": "128K",
"image": "factory/bootinfo_spinand.bin"
},
{
"name": "fsbl",
"offset": "128K",
"size": "256K",
"image": "factory/FSBL.bin"
},
{
"name": "env",
"offset": "384K",
"size": "128K"
},
{
"name": "opensbi",
"offset": "640K",
"size": "384K",
"image": "opensbi.itb"
},
{
"name": "uboot",
"offset": "1M",
"size": "2M",
"image": "u-boot.itb"
},
{
"name": "user",
"offset": "3M",
"size": "-",
"volume_images": {"bootfs": "bootfs.img", "rootfs": "rootfs.img"}
}
]
}
2.2.1.5 卡启动
卡启动是指将镜像写入到sd卡中,设备插入该sd卡后,上电启动将从sd卡加载启动系统。
K1平台支持卡启动,且默认先try sd卡,启动失败后再从pin select选中的存储介质加载启动系统。
本平台不支持通过fastboot协议把镜像烧写到sd卡上。需要通过TitanFlash工具或者dd命令制作卡启动。
以下介绍如何通过刷机工具制作卡启动镜像:
- 将tf卡插入读卡器并接入电脑usb口。
- 电脑端打开titanflash刷机工具(安装方式请参考刷机工具使用章节),点击研发工具->卡启动,选择SD卡,刷机包。点击执行。
- 烧写成功后,将tf卡插入设备,上电后设备从卡启动。
2.2.1.6 卡量产
卡量产是指sd卡中写入刷机相关的镜像文件,设备上电启动后先从卡启动,检测到时卡量产后,将sd卡中的镜像文件,按照分区表的位置写入到pin select选中的存储介质
K1支持卡量产烧录。通过titanflash工具把sd卡制作成量产卡,将sd卡插入设备,上电启动后, 会将镜像烧写到emmc/nor/nand等存储介质中。
卡量产的制作步骤如下:
- 将tf卡插入读卡器并接入电脑usb口。
- 打开titanflash工具,选择量产工具->制作量产卡,选择烧录量产卡,点击执行。
- 完成量产卡制作后,将sd卡插入设备,上电启动后会自动进入卡烧录。
- 完成烧录后需要拔下sd卡,设备端上电启动后能正常启动。(如果不拔下sd卡,重复上电会重复开始卡烧录)
2.2.2 刷机工具
本章节简单介绍刷机工具相关的内容