RK3568 Linux驱动学习——SDK烧录
前言
Rockchip平台提供了多种镜像烧写方式,如在Windows下通过瑞芯微开发工具烧写、通过SD卡方式烧写、通过FactoryTool工具批量烧写(量产烧写工具、支持USB一拖多烧写)以及在Ubuntu下通过Linux_Upgrade_Tool工具烧写等等。总之,烧写镜像的方式有很多种,可以选择合适的烧写方式进行烧写,将镜像文件烧写至开发板。
烧写模式介绍
Rockehip平台硬件设备运行的几种模式如下表所示,只有当设备处于Maskrom以及Loader模式时(必须要通过USB线将开发板的OTG口连接到电脑),才能够烧写镜像,或对板上镜像进行更新操作。
模式 | 是否支持烧录 | 描述 |
---|---|---|
Maskrom | 支持 | Flash在未烧录镜像时,芯片会引导进入Maskrom模式,可以进行初次镜像的烧写;开发调试过程中若遇到无法正常进入Loader模式的情况,也可进入Maskrom模式烧写镜像。 |
Loader | 支持 | Loader模式下可以进行镜像烧写、更新升级,可以通过烧写工具单独烧写某一个分区镜像文件,方便调试。 |
Recovery | 不支持 | 通过引导recovery镜像进入recovery模式,recovery模式主要作用是升级、恢复出厂设置类操作。 |
Normal Boot | 不支持 | 系统正常启动进入该模式,通过引导rootfs启动,加载rootfs根文件系统,大多数开发都是在这个模式下进行。 |
进入Maskrom烧写模式的方法:(先连接电源适配器和OTG)
- 开发板未烧录过镜像,上电之后就会进入到Maskrom模式;
- 开发板烧录过镜像,按住开发板上的UPDATE按键,然后开发发板上电或复位,系统将会进入到Maskrom模式;
- 开发板烧录过镜像,按住开发板上的V-按键(音量-)按键,然后开发板上电或复位,系统将会进入到Maskrom模式;
- 开发板烧录过镜像,在U-Boot命令行下,执行"rbrom"命令进入到Maskrom模式。
进入Loader烧写模式的方法:(先连接电源适配器和OTG)
- 开发板烧录过镜像,按住V+按键(音量+)按键,然后开发板上电或复位,系统将会进入到Loader模式;
- 开发板烧录过镜像,在U-Boot命令行下,执行"download"命令进入到Loader模式;
- 开发板烧录过镜像,在Linux系统下,通过串口或ADB执行命令"reboot loader"重启进入到Loader模式;
- 开发板烧录过镜像,上电或复位后开发板正常启动进入到系统后,瑞芯微开发工具(也就是RKDevTool工具)会显示"发现一个ADB设备",然后点击"切换"按钮,进入到Loade模式。
以上介绍了开发板如何进入到Maskrom或Loader烧写模式,只有进入Maskrom模式或Loader模式后才可进行烧录。
Windows系统下烧写
首先将之前已经编译好的SDK镜像文件(~/rk3568_linux_sdk/rocdev/镜像)从Ubuntu拷贝到Windows下,可以将这个目录命名为rk3568_images,包括了boot.img、MiniLoaderAll.bin、misc.img、oem.img、parameter.txt(分区表文件,不是镜像)、recovery.img、rootfs.img、uboot.img、userdata.img,如下所示:
连接好开发板后,打开瑞芯微开发工具,然后按住UPDATE并按下RST按键来进入MASKROM模式:
分区表parameter.txt
看一下RK平台分区表文件parameter.txt,该文件是一个txt文件。parameter.txt文件描述了开发板的分区表信息,每个分区的名字、分区的起始地址以及分区的大小等信息,来看下它的内容:
FIRMWARE_VER: 1.0<br>MACHINE_MODEL: RK3568<br>MACHINE_ID: 007<br>MANUFACTURER: RK3568<br>MAGIC: 0x5041524B<br>ATAG: 0x00200800<br>MACHINE: 0xffffffff<br>CHECK_MASK: 0x80<br>PWR_HLD: 0,0,A,0,1<br>TYPE: GPT<br>CMDLINE: <br>mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x00008000(boot),0x00020000@0x00028000(recovery),0x00010000@0x00048000(backup),0x00c00000@0x00058000(rootfs),0x00040000@0x00c58000(oem),-@0x00c98000(userdata:grow)<br>uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
parameter.txt文件中除了分区表信息之外,还包含其它标识,如FIRMWARE_VER、MACHINE_MODEL、MACHINE_ID、MAGIC 等,不做展开。主要来看一下mtdparts标识所定义的分区信息,如下:
rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x00008000(boot),0x00020000@0x00028000(recovery),0x00010000@0x00048000(backup),0x00c00000@0x00058000(rootfs),0x00040000@0x00c58000(oem),-@0x00c98000(userdata:grow) |
rk29xxnand是一个标识,为了兼容性,rockchip平台都是用rk29xxnand做标识。
诸如0x00002000@0x00004000(uboot)、0x00002000@0x00006000(misc)等信息用于定义分区,@符号之前的数值是分区大小,@符号之后的数值是分区的起始位置,括号里面的字符是分区的名字;所有数值的单位都是sector(扇区),1个sector为512字节。所以由此可知,uboot分区的起始位置为0x4000 sectors位置,大小为0x2000 sectors(4MB);misc分区的起始位置为0x6000 sectors位置,大小也是0x2000 sectors。
为了性能,每个分区起始地址需要32KB(64 sectors)对齐,大小也需要32KB的整数倍。
最后一个分区需要指定grow参数,表示将剩余存储空间全部分配给该分区。
每个分区作用如下:
配置
通过上小节分析可知,parameter.txt文件中一共定义了8个分区,提供了每个分区的名字起始地址以及分区大小,接下来需要手动配置瑞芯微开发工具,配置完之后如下图所示:
这里需要注意几个点:
- 瑞芯微开发工具中地址数值的单位也是sectors(扇区,-一个扇区等于512字节);
- 第一项对应的是MiniLoaderAll.bin镜像,它的烧录地址不用配置,直接使用0x0即可。因为MiniLoaderAll.bin镜像有专门的烧录地址,无需用户配置,而且它的名字一般都是Loader(或小写loader),不要去改动它;
- 上图中第二项对应的是分区表parameter.txt,同样它的地址也不下用配置,直接使用0x0即可,因为parameter.txt文件不会烧录到Flash中,但会读取该文件定义的分区、去初始化Flash物理分区;同样,它的名字为parameter(或者大写Parameter),不要去改动它,因为底层需要通过这个"parameter"名字来识别分区表文件。
- 除了MiniLoaderAllbin和parameter.txt稍微特殊一点之外,其它镜像直接根据parameter.txt分区表定义的起始地址进行配置即可,名字尽量使用parameter.txt文件中所定义的分区名。
配置完成后,可以将配置导出保存到.cfg文件,方便下次使用,如下图所示:
将配置信息导出、保存到config.cfg文件中,方便下次导入该配置信息。
烧录
如下图所示:
执行过程中,右侧空白处会输出log信息,如下图:
也可以只烧录特定镜像,只勾选对应的这一项即可。
启动系统
烧录完成后会自动重启开发板,进入Linux buildroot系统,串口终端(波特率15M)会输出信息:
烧录update.img
我没有烧录这个的时候,就会在上图卡住。
进入开发工具:
选择了对应的update.img之后,点击“升级”就会进入烧录。
之后就能够正常开机了。
Ubuntu系统下烧写
在Ubuntu,就不需要先拷贝到主机了。
烧写工具在~/rk3568_linux_sdk/tools/linux/Linux_Upgrade_Tool路径下,如下图:
这个upgrade_tool有两种运行模式:命令行模式和工具模式,直接运行upgrade_tool命令,不加任何参数则会进入到工具模式,工具模式其实就是一个交互模式,在交互模式下用户可以输入指令、然后按回车执行该指令,那么就会触发该指令所对应的操作,譬如下下载镜像、擦除镜像、读取设备信息等等。
运行upgrade_tool命令时加入参数(如UF UL DI DB等等)则会进入命令行模式,所谓
命令行模式,运行upgrade_tool命令后无法与用户进行交互,通过传入的参数来告诉upgrade_tool工具本次需要执行什么操作,如说烧写镜像、擦除等,执行完完任务后就会退出。
使用upgrade_tool工具烧写
将开发板连接到虚拟机之后,可以通过命令行模式来进行烧写。
Ubuntu中进入rockdev目录,同时将开发板设置到Maskrom或Loader模式。
upgrade_tool工具支持很多指令,不同指令可以执行不同的操作,譬如CD、LD、SD、UF、DB、TD、RD等等(大小写都行),有些指令需要带参数、而有些指令则不需要带参数。
使用UL指令烧写MiniLoaderAll.bin镜像,使用DI指令烧写其它镜像(uboot.img、boot.img、oem.img、userdata.img、rootfs.img、misc.img等)以及分区表文件parameter.txt。
先烧写MiniLoaderAll.bin镜像,使用UL指令烧写MiniLoaderAll.bin(执行upgrade_tool命令时需要加入sudo获取到root用户权限,否则操作会失败!):
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool UL MiniLoaderAll.bin -noreset
upgrade_tool命令后面携带了3个参数表示需要执行的指令,UL指令用于烧写MiniLoaderAll.bin,第二个参数用于指定MiniLoaderAll.bin所在路径,第三个参数-noreset表示烧写完MiniLoaderAll.bin之后不要复位开发板(不要复位设备)。
烧写完MiniLoaderAll.bin之后,接下来需要通过DI指令下载parameter.txt分区表:
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -p parameter.txt
接下来烧录其他镜像:
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -uboot uboot.img
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -misc misc.img
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -boot boot.img
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -recovery recovery.img
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -oem oem.img
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -rootfs rootfs.img
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool DI -userdata userdata.img
"DI-<partition_name>"中的 partition_name便是分区名,如-boot就是boot分区、-oem
就是oem分区;使用upgrade_tool工具烧写镜像无需用户指定烧写址,parameter.txt文件已经定义了各分区的起始位置,也就是镜像的烧录地址。
如果执行命令出错,可以尝试复位、重启开发板,再次操作。
最后,当所有镜像全部烧录完成后,可以执行下面这条命令复位开发板、重新启动系统:
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool RD
烧写update.img
开发板处于Maskrom或Loader模式下,执行如下命令烧录update.img固件(使用UF指令烧录update.img):
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool UF update.img
完成后会自动复位开发板。
擦除操作
开发板处于Maskrom或Loader模式下,执行如下命令可以擦除Flash中的所有数据(使用EF指令):
sudo ../tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool/upgrade_tool EF MiniLoaderAll.bin
也可以按地址进行扇区擦除,由用户指定擦除的起始位置和大小(使用EL指令)。
使用rkflash.sh脚本烧写
rkflash.sh脚本是RK提供的烧录脚本,可以直接用这个脚本进行烧录,其内部就是调用了upgrade_tool工具。
用法也非常简单,首先让开发板处于Maskrom或Loader模式下,直接运行rkflash.sh脚本即可将rockdev目录下的镜像烧录到开发板(同样也需要加入sudo,否则操作会失败):
sudo ./rkflash.sh
执行上述命令会将rockdev目录下的boot.img、MiniLoaderAll.bin、misc.img、oem.img、recovery.img、rootfs.img、uboot.img、userdata.img烧写到开发板对应分区。
烧录完之后会自动复位开发板。
还可以单独烧录某个镜像: