Hi3519v101烧录方法
工具准备
海思芯片使用的烧录工具为HiTool,该软件及使用说明文档的存放路径在《Hi3519 V101R001 交付件清单.xlsx》里有明确的说明。
烧录文件
在《Hi3519V101/Hi3516AV200 SDK 安装以及升级使用说明.txt》中有关于SDK结构的介绍,pub
存放的是编译好的,开始的时候这个目录是空的,而image_*
中存放的是官方编译好的,如果合适,可以直接拿来用。
Hi3519V101_SDK_Vx.x.x.x 目录结构如下:
|-- sdk.cleanup # SDK清理脚本
|-- sdk.unpack # SDK展开脚本
|-- osdrv # 存放操作系统及相关驱动的目录
| |-- opensource # opensource源代码
| | |-- busybox # busybox源代码
| | |-- kernel # linux内核源代码
| | |-- toolchain # 交叉编译器
| | |-- uboot # uboot源代码
| |-- pub # 编译好的镜像、工具、drv驱动等
| |-- tools # linux工具源代码
| |-- readme_cn.txt # osdrv使用说明(中文版)
| |-- readme_en.txt # osdrv使用说明(英文版)
| |-- ...... #
| |-- Makefile # osdrv Makefile
|-- osal # 存放操作系统适配层的头文件和源文件的目录
| |-- include # 存放操作系统适配层的头文件的目录
| |-- source # 存放操作系统适配层的源文件的目录
|-- package # 存放SDK各种压缩包的目录
| |-- osdrv.tgz # linux内核/uboot/rootfs/tools源码压缩包
| |-- osal.tgz # 操作系统适配层源码压缩包
| |-- mpp_*.tgz # 媒体处理平台软件压缩包
| |-- drv.tgz # drv压缩包
| |-- image_* # 可供FLASH烧写的映像文件(如内核、根文件系统)和rootfs的压缩包
|-- scripts # 存放shell脚本的目录
|-- drv # drv目录
| |-- extdrv # 板级外围驱动源代码
| |-- interdrv # mipi,rtc,cipher等驱动源代码
|-- mpp_single # 存放单核媒体处理平台的目录
| |-- component # 组件源代码
| |-- init # 内核模块的初始化源代码
| |-- obj # 内核模块的obj文件
| |-- include # 对外头文件
| |-- ko # 内核模块
| |-- lib # release版本库以及音频库
| |-- Makefile.param # mpp一些全局编译选项
| |-- Makefile # mpp的Makefile
| |-- linux.param # mpp一些跟操作系统相关的全局编译选项
| |-- tools # 媒体处理相关工具
| |-- sample # 样例源代码
|-- mpp_big-little # 存放big-little双核媒体处理平台的目录
烧录说明
这里只是纯粹记录烧录的方法,所以烧录用的镜像文件直接使用image_*
中官方编译的。
烧录bootloader
- 打开HiTool工具,切换到“烧写Fastboot”选项;
- 选择好对应的串口号;
- Flash类型里选择“spi”,选什么类型具体看自己板子原理图或相关的说明文档来确定,我的板子用的spi flash;
- 选择对应的u-boot-xxx.bin文件;
- 点击烧写按钮;
- 给板子上电,如果已经上电就先断电再重新上电;
按分区烧录
空间划分
在讲具体的分区烧录步骤前,得先搞明白"分区"这个概念。在《Hi3519V101/Hi3516AV200 SDK 安装以及升级使用说明.txt》中有个简明的示意图,这图跟在单片机里做IAP很像。flash起始处放bootloader,设备开机后先运行bootloader,然后再跳到APP里。在这里是kernel和rootfs就相当于APP了,bootloader起来后分别挂在kernel(内核)、rootfs(跟文件系统)。
| 1M | 3M | 12M |
|---------------|---------------|---------------|
| boot | kernel | rootfs |
从上面这个图引出两个问题,
-
1)、boot、kernel和rootfs的烧录文件是什么格式?
而在《Hi3516AV200 Linux 开发环境用户指南.pdf》中有对于根文件系统各个格式的介绍
从image_*
中(下图)看到,可以很容易区分boot、kernel和rootfs的烧录文件,其中rootfs_hi3519v101_64k.jffs2中的64k
是spi flash的block大小,该参数可以通过查spi flash的数据手册得到。
-
2)、boot、kernel和rootfs的分区大小如何确定?
根据烧录文件的大小进行划分,kernel是3030KB,小于3M,那就分配3MB。boot才291KB,却给1MB是啥意思呢,其实也没啥,就是我钱多,用得起大容量Flash,为了方便分区,干脆给个1MB。
烧录步骤
- 选择传输方式,这里选网口,串口也可以,但是速度非常慢;
- 选好对应的串口号(即使上一步选了网口,Fastboot也是通过串口下载的),服务器IP(就是本机的IP);
- 配好板端配置的参数,这些参数可以进入bootloader后,通过输入
printenv
打印出来; - 新建并配置好各个分区的参数,具体的配置方法可以查看《HiBurn 工具使用指南.pdf》,要注意的是,rootfs中
jffs2
不是特殊的格式,因此文件系统处选择none
;
- 点击"烧写",然后给板子重新上电;
- 烧写完成后给板子重新上电,进入bootloader设置启动参数;
setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=hi_sfc:1M(boot),3M(kernel),28M(rootfs)' setenv bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x300000;bootm 0x82000000' saveenv reset
bootargs定义传递给Linux内核的命令行参数。引导内核启动后,内核会去解析该启动参数,从而保证系统的正常启动。一个个来看看:
setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=hi_sfc:1M(boot),3M(kernel),28M(rootfs)'
—— mem=64M // 分配给操作系统的内存为64M
—— console=ttyAMA0,115200 // 使用串口0作为控制台(串口设备要根据实际的设备名称来设置),波特率为115200
—— root=/dev/mtdblock2 // 指定根文件系统的位置,mtdblock2 代表mtdparts的第3分区 (第一个分区为mtdblock0)
—— rootfstype=yaffs2 // 指定根文件系统的类型,这个选项需要跟root一起配合使用,一般如果根文件系统是ext2的话,有没有这个选项是无所谓的,但是如果是jffs2,squashfs等文件系统的话,就需要rootfstype指明文件系统的类型,不然会无法挂载根分区。
—— rw // linux-3.18.y kernel默认文件系统只读,需要在bootargs中加入rw选项,文件系统才可读写
—— mtdparts=hi_sfc:1M(boot),3M(kernel),28M(rootfs) // 设置分区信息,‘hi_sfc’是mtd-id,跟具体平台的flash有关
bootcmd是启动命令,稍稍解释一下:
sf probe 0 /* 命令格式sf probe [[bus:]cs] [hz] [mode],按给定的总线和片选初始化 SPI-Nor flash*/
sf read 0x82000000 0x100000 0x300000 /* 将kernel加载到内存中(这条命令的格式是read addr offset size,从Flash的offset偏移地址处开始读取size字节的数据到SDRAM的addr地址,前面可以看到kernel的偏移和大小,和这里对应) */
bootm 0x82000000 /* 从内存地址0x82000000启动内核, 启动前需把内核镜像uImage存放到指定的内存地址 */