前言

由于我自己已经有了一个虚拟机,因此基于现有的虚拟机搭建环境。第一次接触hisi。希望能有一个好的开头。

硬盘扩容

我虚拟机上面已经有了两个硬盘,但是为了以后更好的迁移,我准备新建一个虚拟硬盘。来搭建开发环境。参考我以前的文章virtualbox 新增硬盘并挂载
由于这是第三个硬盘,因此设备符号就变成了/sdc

  1. zhou@zhou:~$ ls -al /dev/sd*
  2. brw-rw---- 1 root disk 8, 32 Apr 20 13:27 /dev/sdc
  • 先分一个50G ```bash zhou@zhou:~$ sudo fdisk /dev/sdc Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Partition number (1-4, default 1): First sector (2048-134217727, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-134217727, default 134217727): +48G Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.

文件格式化

zhou@zhou:~$ sudo mkfs.ext4 /dev/sdc1

  1. - 上电自动挂载
  2. ```bash
  3. # 查看 UUID
  4. zhou@zhou:/$ sudo blkid
  5. /dev/sdc1: UUID="636cc0df-28f0-431b-aa76-6499bf93090a" TYPE="ext4" PARTUUID="636ee420-01
  6. # 修改 fstab 添加下面一句, 记得创建挂载的目录
  7. UUID=636cc0df-28f0-431b-aa76-6499bf93090a /home/zhou/hisi516 ext4 defaults 0 1
  8. # 先不要重启,测试一下是否修改成功
  9. zhou@zhou:/$ sudo mount -a
  10. zhou@zhou:/$ di
  11. /dev/sdc1 /home/zhou/hisi 47.0G 0.1G 44.5G 5% ext4
  12. # 修改属组
  13. sudo chown -r zhou:zhou hisi516
  14. # 现在表示修改成功了,可以重启测试一下。

编译工具等搭建

himix100交叉编译工具

  1. tar -zxf arm-himix100-linux.tgz
  2. # 分析arm-himix100-linux.install脚本。 然后指定编译的路径 $HOME/hisi516/toolchain/x86-arm
  3. sudo ./arm-himix100-linux.install $HOME/hisi516/toolchain/x86-arm

由于不喜欢修改profile文件,因此指定了~/.bashrc文件。
arm-himix100-linux.sh
测试出现了下面的问题,

  1. zhou@zhou:~/hisi516/toolchain/arm-himix100-linux$ arm-himix100-linux-gcc --version
  2. arm-himix100-linux-gcc: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed.
  3. Aborted (core dumped)

根据_nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))’ failed文章。使用下面的命令即可解决。

  1. export LC_ALL=C

再次测试就成功了。

安装SDK

我拿到的一共有以下三个版本的SDK

  1. Hi3516EV200R001C01SPC001
  2. Hi3516EV200R001C01SPC002
  3. Hi3516EV200R001C01SPC011

决定使用Hi3516EV200R001C01SPC011
参考《Hi3516EV200╱Hi3516EV300╱Hi3518EV300 Linux SDK 安装以及升级使用说明.pdf》文档。

  1. zhou@zhou:~/hisi516/sdk$ tar -zxvf Hi3516EV200_SDK_V1.0.1.1.tgz
  2. # 解压内部其他的文件
  3. # 记得修改以下 解释器 #!/bin/bash
  4. zhou@zhou:~/hisi516/sdk/Hi3516EV200_SDK_V1.0.1.1$ sudo ./sdk.unpack
  5. # 文件分布
  6. zhou@zhou:~/hisi516/sdk/Hi3516EV200_SDK_V1.0.1.1$ ls
  7. drv mpp osal osdrv package scripts sdk.cleanup sdk.unpack
  1. zhou@zhou:~/hisi516/sdk/Hi3516EV200_SDK_V1.0.1.1$ tree -L 2
  2. |-- drv # drv 目录
  3. | |-- extdrv # 板级外围驱动源代码
  4. | |-- interdrv # mipi,cipher 等驱动源代码
  5. |-- mpp # 存放单核媒体处理平台的目录
  6. | |-- component # mpp 组件
  7. | | |-- isp # isp 相关组件
  8. | |-- include # 头文件
  9. | |-- init # 内核模块的初始化源代码
  10. | |-- ko # 内核ko 模块
  11. | |-- lib # 用户态 lib 库
  12. | |-- obj # 内核模块的obj 文
  13. | |-- sample # 样例源代码
  14. | |-- tools # 媒体处理相关工具
  15. | |-- cfg.mak # mpp 配置文件
  16. | |-- Makefile.param # mpp 全局编译选项
  17. | |-- Makefile.linux.param # mpp linux 编译选项
  18. |-- osal # 存放操作系统适配层的头文件和源文件的目录
  19. | |-- include # 存放操作系统适配层的头文件的目录
  20. | |-- linux # 存放linux 系统适配层的源文件的目录
  21. |-- osdrv # 存放操作系统及相关驱动的目录
  22. | |-- opensource # opensource 源代码
  23. | | |-- busybox # busybox 源代码
  24. | | |-- kernel # linux 内核源代码
  25. | | |-- uboot # uboot 源代码
  26. | |-- pub # 编译好的镜像、工具、drv 驱动等
  27. | |-- tools # 工具源代码
  28. | |-- readme_cn.txt # osdrv 中文使用说明
  29. | |-- readme_en.txt # osdrv 英文使用说明
  30. | |-- ...... #
  31. | |-- Makefile # osdrv Makefile
  32. |-- package # 存放SDK 各种压缩包的目录
  33. | |-- drv.tgz # drv 压缩包
  34. | |-- mpp.tgz # 媒体处理平台软件压缩包
  35. | |-- osal.tgz # 操作系统适配层源码压缩包
  36. | |-- osdrv.tgz # linux 内核/uboot/rootfs/tools 源码压缩包
  37. | |-- rootfs_uclibc.tgz # 文件系统相关源文件压缩包
  38. | |-- image_* # 可供 FLASH 烧写的映像文件(如内核、根文件系统)和rootfs 的压缩包
  39. |-- scripts # 存放shell 脚本的目录
  40. |-- sdk.cleanup # SDK 清理脚本
  41. |-- sdk.unpack # SDK 展开脚本

烧写程序

我们拿到板子有两种情况,无u-boot以及有u-boot的情况。

tftpd32 服务器搭建

使用tftpd32 在win10上面搭建好服务器。。。。

无u-boot烧写u-boot

参考《HiBurn 工具使用指南》文档

有u-boot的情况

可以按照以下步骤使用网口烧写 uboot、kernel及 rootfs 到 Flash 中。

  1. # 设置 serverip(即 tftp 服务器的 ip)、ipaddr(单板ip)和 ethaddr(单板的 MAC 地址)。
  2. # 开机启动,进入u-boot控制界面
  3. # 我主机win10的IP地址
  4. setenv serverip 192.168.1.102
  5. # 设置hisi开发板的地址
  6. # 记得修改NFS的访问地址
  7. setenv ipaddr 192.168.1.199
  8. # 修改MAC地址,这个可以随意
  9. setenv ethaddr 32:34:46:78:9A:DC
  10. # 没什么好说的
  11. setenv netmask 255.255.255.0
  12. # 大部分情况下都是路由器的IP地址,除非您没有和路由器连接
  13. setenv gatewayip 192.168.1.1
  14. # 习惯性的保存,当然也可以不保存
  15. saveenv
  16. # 查看变量
  17. printenv

上面我们设置好了环境变量,下一步就是将对应的二进制文件读取到内存中,然后烧写到Flash中。那么就存在两个问题。烧写到内存那个位置? 以及烧写到Flash的那个位置?

确定Flash分区

我拿到的开发板是32M的FLash。不过由于对应的数据手册里面只讲了16M的FLash分配表。没有讲32M的。那么首先我们应该确定这32M的分区。然后参照手册来烧写命令。u-boot启动时,进入命令行。

  1. # 输出环境变量
  2. hisilicon # printenv
  3. bootargs=mem=40M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=squashfs mtdparts=hi_sfc:384K(boot),2M(kernel),2M(rootfs),5M(appfs),384K(param)
  4. # 请注意mtdparts

可以看到384K(boot),2M(kernel) ,2M(rootfs),

  • 下面我们更新jffs2系统试试,这个是我拿到的供应商精简以后的u-boot ```c 0x60000 对应384K 0x200000 对应2M

烧写u-boot,分配的大小 384K

清空一块内存

mw.b 0x42000000 0xff 0x60000

从tftp下载 uimage

tftp 0x42000000 Hi3516EV200_uboot.bin

sf probe 0;sf erase 0x0 0x60000;sf write 0x42000000 0x0 0x60000

烧写内核,分配的FLash大小 2M

mw.b 0x42000000 0xff 0x200000

首先烧写到内存

tftp 0x42000000 Hi3516EV200_uImage.bin

u-boot后面紧接着内核,大小是2M, 起始地址0+0x60000

sf probe 0;sf erase 0x60000 0x200000;sf write 0x42000000 0x60000 0x200000

烧写文件系统(jffs2)

mw.b 0x42000000 0xff 0x200000

从tftp下载 uimag

tftp 0x42000000 Hi3516EV200_rootfs.bin

内核后面紧接着就是文件系统,大小2M,起始地址0x60000+0x200000,

sf probe 0;sf erase 0x260000 0x200000;sf write 0x42000000 0x260000 0x200000

最后记得修改启动参数

setenv bootargs ‘mem=40M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=hi_sfc:384K(boot),2M(kernel),2M(rootfs)’

启动命令

setenv bootcmd ‘sf probe 0;sf read 0x42000000 0x60000 0x200000;bootm 0x42000000’

保存命令

saveenv

重启

reset

  1. TIPS:<br />由于没有找到对应的资料。关于rootfs的存放地址。观察海思的提供的资料,都是内核后面紧跟着rootfs。因此我也默认这样,希望以后能够找到对应的证据。
  2. <a name="eG3Qf"></a>
  3. ## 测试板卡是否正常
  4. 打开VLC media player,选择打开网络串流。确定开发板的IP地址。这个命令不具有普遍性。
  5. ```c
  6. rtsp://192.168.1.242/stream/av0_0

有画面出来,那么就代表着成功了。表示摄像头时正常的。

正式开发

根据 Hi3516EV200_SDK_V1.0.1.1.tgz 中的文档开发

内核 v4.9.37

readme_cn.txt
国内Linux镜像网站 下载 linux-4.9.37.tar.gz将其复制到

  1. osdrv/opensource/kernel 文件夹
  2. # 解压
  3. zhou@zhou:~/hisi516/sdk/Hi3516EV200_SDK_V1.0.1.1/osdrv/opensource/kernel$ tar -zxvf linux-4.9.37.tar.gz
  4. # 重命名一下
  5. mv linux-4.9.37 linux-4.9.y
  6. # 切换一下目录
  7. cd linux-4.9.y
  8. # 打补丁
  9. patch -p1 < ../linux-4.9.37.patch
  10. # 回到刚才目录
  11. cd ..
  12. # 重新保存一下
  13. tar -czf linux-4.9.y.tgz linux-4.9.y
  14. # 又进入内核目录
  15. cd linux-4.9.y/
  16. # 复制.config
  17. cp arch/arm/configs/hi3516ev200_full_defconfig .config
  18. # 即使不修改也要打开 menuconfig 一次
  19. make ARCH=arm CROSS_COMPILE=arm-himix100-linux- menuconfig
  20. # 编译
  21. make ARCH=arm CROSS_COMPILE=arm-himix100-linux- uImage

u-boot-2016.11

  1. tar -zxvf u-boot-2016.11.tgz
  2. # Flash启动
  3. make ARCH=arm CROSS_COMPILE=arm-himix100-linux- hi3516ev200_defconfig
  4. # (emmc启动时执行如下操作:make ARCH=arm CROSS_COMPILE=arm-himix100-linux- hi3516ev200_emmc_defconfig)
  5. # 编译
  6. make ARCH=arm CROSS_COMPILE=arm-himix100-linux-
  7. # 编译hi_gzip 如果这里编译出错,可以自己手动去编译
  8. make -C ../../../tools/pc/hi_gzip
  9. # 复制 gzip
  10. cp ../../../tools/pc/hi_gzip/bin/gzip arch/arm/cpu/armv7/hi3516ev200/hw_compressed/ -rf

现在需要在win10上,使用excel生成 reg_info.bin,然后将其重命名为 .reg
这一步暂时还不知道怎么处理,但是海思内核提供了对应的u-boot。暂时只能先将就直接使用现成的.bin文件

  1. cp reg_info.bin .reg
  2. # 最后将.reg 复制到boot源代码目录下
  3. # 最后编译
  4. make ARCH=arm CROSS_COMPILE=arm-himix100-linux- u-boot-z.bin
  5. #

最后将会

文件系统

gdb-7.9.1

https://mirrors.sjtug.sjtu.edu.cn/gnu/
gdb-7.9.1.tar.gz
ncurses-6.0.tar.gz

gdbserver调试

  1. # 在目标板上面 等待主机的连接
  2. gdbserver :2000 hello &
  3. # 主机上面调用
  4. ## 首先启动gdb
  5. gdb
  6. ## 与目标机连接
  7. target remote 192.168.0.5:2000 # 2000 /*192.168.0.5为单板IP*/
  8. remote debugging using 10.70.153.100:2000
  9. 0x40000a70 in ?? () # 连接成功以后会出现上面的提示
  10. ##
  11. add-symbol-file hello 40000a70
  12. ## 或者可以使用 file hello

问题记录

  • loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))’ failed

    1. export LANG=C
  • /bin/sh: 1: pushd: not found

/bin/sh: 2: ./configure: not found
编译错误: /bin/sh: 1: pushd: not found的问题

  1. sudo ln -s /bin/bash /bin/sh

NFS网络启动

首先使用jffs2_mount_mtdram.sh挂载文件系统。 jffs2的。将所有的文件复制到/home/zhou/hisi516/sysroot ,并且递归修改所有文件属组。

  1. zhou@zhou:~/hisi516/sysroot$ sudo chown zhou:zhou * -R

然后将/home/zhou/hisi516/sysroot开启NFS。

  1. cat /etc/exports
  2. /home/zhou/hisi516/sysroot *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
  3. # 重启NFS
  4. sudo systemctl restart nfs-kernel-server
  5. # 先在开发板上面测试
  6. mount -t nfs -o nolock,vers=3 192.168.1.15:/home/zhou/hisi516/sysroot /root/NFS
  • 修改bootargs

参考Linux内核文件Documentation\filesystems\nfs\nfsroot.txt

  1. nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
  2. ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:
  3. <dns0-ip>:<dns1-ip>
  4. # 最终bootargs
  5. setenv bootargs 'mem=40M console=ttyAMA0,115200 root=/dev/nfs nfsroot=192.168.1.15:/home/zhou/hisi516/sysroot,nolock,vers=3 ip=192.168.1.201:192.168.1.15:192.168.1.1:255.255.0.0::eth0:off rw'

运行例程 - sample_vio

当我们在虚拟机上面编译好了所有的程序以后,我们可以使用hisi提供的sample来测试程序是否正常。
首先我们需要确定.ko文件都是您自己所编译的。并非是供应商提供。除了.ko文件,其他的东西,比如内核,文件系统是否使用自己编译不重要。

  1. # 首先挂载NFS
  2. mount -t nfs -o nolock,vers=3 192.168.1.15:/home/zhou/hisi516/sysroot/root/NFS /root/NFS
  3. # 复制的目的路径看您怎么设置了
  4. # 将编译好的所有Hi3516EV200_SDK_V1.0.1.1/mpp/ko/的所有文件复制到 开发板的 /app/komod
  5. zhou@zhou:~/hisi516/sdk/Hi3516EV200_SDK_V1.0.1.1/mpp/ko$ ls
  6. extdrv hi3516ev200_aenc.ko hi3516ev200_base.ko hi3516ev200_isp.ko hi3516ev200_rgn.ko hi3516ev200_venc.ko hi3516ev200_vpss.ko hi_osal.ko load3516ev200
  7. hi3516ev200_acodec.ko hi3516ev200_ai.ko hi3516ev200_chnl.ko hi3516ev200_ive.ko hi3516ev200_sys.ko hi3516ev200_vgs.ko hi3516ev200_wdt.ko hi_user.ko load3516ev300
  8. hi3516ev200_adc.ko hi3516ev200_aio.ko hi3516ev200_h264e.ko hi3516ev200_jpege.ko hi3516ev200_tde.ko hi3516ev200_vi.ko hi_cipher.ko hifb.ko load3518ev300
  9. hi3516ev200_adec.ko hi3516ev200_ao.ko hi3516ev200_h265e.ko hi3516ev200_rc.ko hi3516ev200_vedu.ko hi3516ev200_vo.ko hi_mipi_rx.ko load3516dv200 sys_config.ko
  • 因为不确定您使用的文件系统是否会自动的加载这些模块,需要您使用lsmod命令查看。若是没有加载需要您使用 ```c /app/komod/load3516ev200 -a -sensor imx307_2l -osmem 40 -total 64

    -osmem 40 指定内存

    -sensor imx307_2l 指定摄像头类型

然后运行编译好的 sample_vio 文件(在开发板上运行)

./sample_vio 0 等待一分钟,我们可以观察到新生成了一个 stream_chn0.h265

将 stream_chn0.h265 弄到虚拟机

修改权限

chmod 774 stream_chn0.h265

使用vlc 即可播放视频文件

vlc stream_chn0.h265 ```

参考资料

《Hi3516EV200╱Hi3516EV300╱HI3518EV300╱Hi3516D V200 U-boot 移植应用开发指南》《Hi3516EV200╱Hi3516EV300╱Hi3518EV300╱Hi3516DV200 开发环境用户指南》《Hi3516EV200╱Hi3516EV300╱Hi3518EV300╱Hi3516DV200 Linux SDK 安装以及升级使用说明》