美文网首页
Hi3519v101烧录方法

Hi3519v101烧录方法

作者: tianxiaoMCU | 来源:发表于2019-06-27 18:50 被阅读0次

    工具准备

    海思芯片使用的烧录工具为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的烧录文件是什么格式?
      image_*中(下图)看到,可以很容易区分boot、kernel和rootfs的烧录文件,其中rootfs_hi3519v101_64k.jffs2中的64k是spi flash的block大小,该参数可以通过查spi flash的数据手册得到。

      而在《Hi3516AV200 Linux 开发环境用户指南.pdf》中有对于根文件系统各个格式的介绍
    • 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存放到指定的内存地址 */
    

    相关文章

      网友评论

          本文标题:Hi3519v101烧录方法

          本文链接:https://www.haomeiwen.com/subject/dmuccctx.html