前言

本文介绍的是拿到海思芯片的开发板和海思的SDK开发包,在裸机上部署uboot、kernel、rootfs、mpp的过程,其中不涉及uboot、kernel、rootfs、mpp的细节,主要是介绍如何使用开发包快速的将海思芯片跑起来。(这里的裸机是指海思芯片就是出厂的状态,连uboot都没有)。本文大体上是从逻辑上讲解如何部署海思SDK,并不能保证你能按着文章讲解的顺序就能畅通无阻的完成SDK的部署。光是编译uboot、kernel、rootfs就可能遇到很多错误,每个人的开发环境不同,遇到的错误也不一样,在这里不讲解可能遇到的错误,有问题就去百度。

1.芯片介绍

我用的是HI3518EV200这款芯片,现在来看这款芯片的性能并不算好,但是只用该芯片做单纯录像的监控设备,性能还是足够的,如果想要跑算法就显得性能不足了。该款芯片内置64M的内存,可以不用外接内存就可以运行,SDRAM的地址范围:80000000-83FFFFFF,我的开发板是外接的16M的spi flash,将来uboot、kernel、rootfs都烧录到spi flash中。

2.部署的思路

(1)首先是搭建开发环境,我是用PC端来开发的,要自己装虚拟机搭建环境,比较麻烦,公司开发都是服务器上进行开发,不用自己搭建环境;
(2)熟悉SDK包,了解目录的结构,找到与编译生成uboot、kernel、rootf1s相关的内容,看文档和编译脚本。
(3)在虚拟机中编译生成uboot、kernel、rootf1s的镜像,;
(4)将uboot、kernel、rootf1s烧录进海思芯片里;
(5)部署mpp:将海思相关的.ko文件和.so文件都拷贝到设备的目录里加载好;
(6)编译SDK包里的sample程序,如果示例程序能在海思芯片上正常运行,说明此次部署已经成功;
(7)后期展望:按照SDK去部署系统是比较基础的,没有针对设备进行优化,比如uboot、kernel、rootfs都是可以针对设备进行精简的,这样可以节省内存,用不上的.ko和.so也不必拷贝到设备里。

3.环境搭建

(1)编译环境:Windows+VMware+Ubuntu;
(2)在虚拟机里搭建好samba服务器、tftp服务器、nfs服务器,调试好网络,确认设备可以通过网络连接上虚拟机;
(3)确认PC和设备可以通过终端模拟软件进行串口通信;

3.SDK开发包的使用:

(1)游览《Hi3518EV20X/Hi3516CV200 U-boot 移植应用开发指南》和《Hi3518EV20X/Hi3516CV200 Linux开发环境用户指南》,里面讲解的是开发环境的搭建和U-boot的移植;
(2)将“Hi3518E_SDK_V1.0.3.0.tgz”压缩包拷贝到Linux环境中进行解压,可以通过共享文件夹或者Samba服务器,推荐共享文件夹;
(3)将压缩包解压开后,可以看到两个脚本文件:sdk.cleanup和sdk.unpack。先执行source sdk.cleanup清除掉整个目录里的中间文件、解压文件、目标文件,确保目录里的文件都是干净的;然后执行source sdk.unpack,将目录里的压缩包都解压开。

4.制作uboot、kernel

(1)安装交叉工具编译链:交叉工具编译链在“Hi3518E_SDK_V1.0.3.0/osdrv/opensource/toolchain/”路径下,有arm-hisiv300-linux和arm-hisiv400-linux两个交叉工具编译链,arm-hisiv300-linux对应uclibc库,arm-hisiv400-linux对应glibc库,自己根据需求选择一个安装。在交叉工具编译链的目录下有个cross.install.v300脚本文件,执行该脚本文件会自动安装交叉工具编译链。该脚本会安装交叉工具编译链并创建链接符号,我们需要将创建的那个路径导出到环境变量PATH里。具体的细节查看cross.install.v300文件。对交叉工具编译链安装不熟悉的可以参考《交叉编译工具链的安装以及介绍》。
(2)安装32位的兼容包:交叉工具编译链是32位的,我的Ubuntu是64位的,所以需要安装lib32z1,因为编译还涉及C++编译还需要装lib32stdc++6-4.8-dbg,推荐使用aptitude进行安装。
(3)将“Hi3518E_SDK_V1.0.3.0/osdrv/opensource/uboot/u-boot-2010.06/tools”路径下的mkimage拷贝到**/usr/local/lib目录下,这是制作镜像需要用到的。
(4)
制作uboot、kernel、rootfs:“Hi3518E_SDK_V1.0.3.0/osdrv”目录里的内容就是制作镜像的,Makefile文件是编译脚本,该Makefile的使用方法看同目录下的readme_cn.txt**文件。理论上来说,按照readme_cn.txt的说明可以直接一条命令就可以生成uboot、kernel、rootfs三个镜像文件,实际编译过程会遇到很多问题。遇到问题就研究Makefile文件或者百度,我反正当时被折磨的够呛。
(5)最终得到三个镜像文件:rootfs_hi3518ev200_64k.jffs2u-boot-hi3518ev200.binuImage_hi3518ev200
特别提醒:制作rootfs时注意文件系统的格式和flash的块大小,这些在readme_cn.txt都有说明。

5.烧写uboot

1.uboot的烧写参考博客《海思烧录工具HiTool的使用方法以及烧录uboot》和《用HiTool烧写uboot到spi flash的原理》。
2.将uboot烧写到0x0起始地址处;

6.烧写kernel、rootfs

已经部署好uboot就不用再使用HiTool进行烧录了,用uboot进行烧写更方便,下面将uboot、kernel、rootfs都再重新烧写一遍

6.1 分区表:

分区名              分区大小            起始地址              截至地址
bootloader:    1M                      0x00000000        0x00100000
kernel:            3M                     0x00100000        0x00400000
rootfs:               12M                   0x00400000         0x01000000
解析:spi flash总共有16M,uboot有266kb,kerner有2.6M,rootfs有4.8M。所以uboot分配1M的地址空间,kernel分配3M,剩下的12M全部分配给rootfs。分区的原则有两个:首先是每个分区要能放得下镜像文件,还有就是有扩展余地,适当多分配一点。

6.2 搭建好tftp下载的环境:

在前期的环境搭建中就在虚拟机中搭建好了tftp服务器,现在只需要将uboot中的serverip改为虚拟机的ip地址,确保开发板可以ping通虚拟机。将uboot、kernel、rootfs的镜像放到虚拟机的tftp目录下,接下来就利用tftp下载烧录镜像。

6.3 烧录的说明:

本次是利用uboot的命令进行烧录,因为前面已经将uboot烧录到了开发板,但是为了烧录的完整性,接下来还会把uboot重新烧录一遍。这里有一些隐含的知识点:1.HI3518EV200芯片的内置内存的地址范围是80000000-83FFFFFF;2.spi flash的起始地址是0x0,且只外接了一块spi flash;spi flash的写操作顺序:选中、擦除、写入;3.uboot、kernel、rootfs烧录到flash的位置要严格按照分区表进行;4.海思芯片的内存是分为系统内存和mmz内存,系统内存由kernel管理,mmz由海思内部管理;5.接下来的操作都是进入到uboot里输入命令进行烧录;

6.3 重新烧录uboot

tftp更新并重新烧写uboot的命令序列:
(1)mw.b 0x82000000 ff 0x100000 //擦除内存:在0x82000000起始地址处按字节写入ff,长度为0x100000(1M)
(2)tftp 0x82000000 u-boot-hi3518ev200.bin //通过tftp命令,将虚拟机tftp目录下的uboot镜像烧录到0x82000000起始的内存处
(3)sf probe 0 //选中spi flash,因为只外接了一片flash,所以是probe 0
(4)sf erase 0x0 0x100000 //从0x0起始,擦除1M大小的地址空间
(5)sf write 0x82000000 0x0 0x100000 //将从0x82000000地址处开始,长度为1M大小的数据写入到0x0地址起始处。也就是把刚才写到内存里的uboot镜像写入到flash中

6.4 烧录kernel

tftp更新并重新烧写kernel的命令序列:
(1)mw.b 0x82000000 ff 0x300000
(2)tftp 0x82000000 uImage_hi3518ev200
(3)sf probe 0
(4)sf erase 0x100000 0x300000
(5)sf write 0x82000000 0x100000 0x300000
备注:以上命令不再解释,和烧录uboot是一样的,只是烧写的地址不一样,结合分区表来看就很容易理解。

6.5 烧录rootfs

tftp更新并重新烧写rootfs的命令序列:
(1)mw.b 0x82000000 ff 0xc00000
(2)tftp 0x82000000 rootfs_hi3518ev200_64k.jffs2
(3)sf probe 0
(4)sf erase 0x400000 0xc00000
(5)sf write 0x82000000 0x400000 0xc00000
备注:以上命令不再解释,和烧录uboot是一样的,只是烧写的地址不一样,结合分区表来看就很容易理解。

6.6设置正确的bootcmd和bootargs

6.6.1 设置bootcmd

命令:set bootcmd ‘sf probe 0;sf read 0x82000000 0x100000 0x300000;bootm 0x82000000’
解析:这是uboot启动的命令,作用是加载kernel。
(1)sf probe 0:选中spi flash;
(2)sf read 0x82000000 0x100000 0x300000:从0x100000地址处读取0x300000(3M)大小的数据到0x82000000地址处。就是将保存到flash的kernel读取到内存中,刚好和我们的烧录是逆过程。
(3)bootm 0x82000000:加载kernel。

6.6.2 设置bootargs

命令set bootargs mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1024K(boot),3072K(kernel),12288K(rootfs)
解析:这是启动uboot的传参,指定一些关键的参数。
(1)mem=32M:这里指明系统分配内存32M(总共有64M的内存);
(2)console=ttyAMA0,115200:系统控制台的波特率是115200
(3)root=/dev/mtdblock2:rootfs在第二个分区(按0、1、2来计数的),对应分区表的第三个分区;
(4)rootfstype=jffs2 :根文件系统的格式是jffs2;
(5)mtdparts=hi_sfc:1024K(boot),3072K(kernel),12288K(rootfs):系统有三个分区:uboot占1M、kernel占3M、rootfs占12M,刚好分配完16M的flash;

7.部署mpp

mpp的部署参考博客《海思芯片部署MPP并验证功能》。

从零开始在海思芯片上部署uboot、kernel、rootfs、mpp相关推荐

  1. 在海思芯片上使用GDB远程调试

    0.载GDB安装包,下载地址:Index of /gnu/gdb,使用8.2版本 1.见下面链接: 在海思芯片上使用GDB远程调试_大橙子疯的博客-CSDN博客_海思gdb调试 和 arm-linux ...

  2. 海思芯片上GPIO操作

    前期 本博客是根据Hi3521A/Hi3520DV300硬件接口用户指南.pdf(其它都一样)写的,具体信息请参考文档,文档下载:https://download.csdn.net/download/ ...

  3. 海思芯片部署MPP并验证功能

    1. 前期准备 1.1搭建好开发环境: 1.这里说的是以个人电脑进行开发:安装好虚拟机,在虚拟机中搭建好nfs服务器,确保开发板可以挂载上虚拟机: 2.确保开发板和PC可以通过串口通信: 1.2熟悉海 ...

  4. 海思3559AV100上运行自己训练的yolov3

    1.简介 现在海思芯片上只支持将caffemodel转成wk文件,然而网上也没有caffe-yolov3,只能使用darknet-yolov3进行训练,然后将模型文件转换成caffemodel文件,再 ...

  5. 海思芯片(hi3516dv300)uboot镜像生成过程详解

    1.前言 (1)本文介绍的uboot编译过程是基于海思提供SDK包里的uboot源码进行编译,具体的编译参数是根据hi3516dv300芯片来设置的,编译生成的uboot烧录镜像也是用于hi3516d ...

  6. 海思芯片(hi3516dv300)uboot启动过程分析

    1.海思分段式uboot镜像 (1)uboot镜像的生成参考博客:<海思芯片(hi3516dv300)uboot镜像生成过程详解>: (2)海思uboot镜像类似于内核的zImage镜像, ...

  7. YOLO系列(v1~v3)的学习及YOLO-Fastest在海思平台的部署(上)

    YOLO系列(v1~v3)的学习及YOLO-Fastest在海思平台的部署(上) YOLO系列(v1~v3)的学习及YOLO-Fastest在海思平台的部署(中) YOLO系列(v1~v3)的学习及Y ...

  8. YOLO系列(v1~v3)的学习及YOLO-Fastest在海思平台的部署(中)

    YOLO系列(v1~v3)的学习及YOLO-Fastest在海思平台的部署(上) YOLO系列(v1~v3)的学习及YOLO-Fastest在海思平台的部署(中) YOLO系列(v1~v3)的学习及Y ...

  9. 设置海思芯片MMZ内存、OS内存详解

    1.前言 (1)本文是基于hi3516dv300芯片的uboot和内核进行讲解: (2)dv300芯片的板子上实际接了2G内存,dv300芯片实际最大也只支持2G内存: 2.hi3516dv300芯片 ...

最新文章

  1. Java实现向指定URL用POST方法发送Json格式字符串参数请求的工具类
  2. 3.4 svm人脸识别
  3. IDEA下搜狗输入法输入中文时卡着不动的参考解决方法
  4. oracle42997,oracle与db2的比较
  5. markdown 目录缩进_页面排版很难吗?一起来学Markdown吧!01基础语法
  6. 第八届蓝桥杯省赛真题--纸牌三角形
  7. 2016学计算机软件,2016年夏季学期计算机(软件)学院学年论文字数、页数和格式要求.doc...
  8. Linux三剑客正则表达式常用字符汇总
  9. 总结过去10年的程序员生涯
  10. 关于 Kubernetes中集群统一日志管理方案(Elasticsearch+Filebeat+Kibana+Metricbeat)搭建的一些笔记
  11. 计算电磁学中的矩量法及其求解过程介绍
  12. word怎么恢复自动保存_如何使用自动恢复自动保存Word文档并恢复丢失的更改
  13. Composer安装包
  14. 右键快捷菜单压缩文件的消失问题解决办法!
  15. 浏览器输入网址后发生了什么?
  16. 计算机的外存与I/O设备
  17. 按键精灵打怪学习-窗口绑定保护技能和点击技能
  18. 搭建CNN卷积神经网络(用pytorch搭建)
  19. GTC 2017现场直击:以人工智能的名义搞一场黑科技的盛会!
  20. 零基础学习java------21---------动态代理,java8新特性(lambda, stream,DateApi)

热门文章

  1. python线程停止后重启_python 多线程重启方法
  2. P3353 在你窗外闪耀的星星
  3. 2021-07-20accelerated c++第2章
  4. C# 键盘响应事件及键值对照表
  5. 计算机通信与网络大纲中英文,《计算机通信网络》教学大纲(电子信息)
  6. [Python]profile优化实践(基于A*算法) 1
  7. 天龙八部科举答题问题和答案(全2/8)
  8. redmine 表格_Redmine Custom tables 自定义表格插件 - Redmine插件中文站
  9. 如何使用spflashtool备份mtk rom
  10. 高级设置_索尼国行OLED电视A8H校准图像设置参数+解锁20点高级色温(白平衡)...