- 前言
- 硬盘扩容
- 文件格式化
- 编译工具等搭建
- 烧写u-boot,分配的大小 384K
- 清空一块内存
- 从tftp下载 uimage
- 烧写内核,分配的FLash大小 2M
- 首先烧写到内存
- u-boot后面紧接着内核,大小是2M, 起始地址0+0x60000
- 烧写文件系统(jffs2)
- 从tftp下载 uimag
- 内核后面紧接着就是文件系统,大小2M,起始地址0x60000+0x200000,
- 最后记得修改启动参数
- 启动命令
- 保存命令
- 重启
- 正式开发
- 运行例程 - sample_vio
- -osmem 40 指定内存
- -sensor imx307_2l 指定摄像头类型
- 然后运行编译好的 sample_vio 文件(在开发板上运行)
- 将 stream_chn0.h265 弄到虚拟机
- 修改权限
- 使用vlc 即可播放视频文件
- 参考资料
前言
由于我自己已经有了一个虚拟机,因此基于现有的虚拟机搭建环境。第一次接触hisi。希望能有一个好的开头。
硬盘扩容
我虚拟机上面已经有了两个硬盘,但是为了以后更好的迁移,我准备新建一个虚拟硬盘。来搭建开发环境。参考我以前的文章virtualbox 新增硬盘并挂载。
由于这是第三个硬盘,因此设备符号就变成了/sdc
zhou@zhou:~$ ls -al /dev/sd*
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
- 上电自动挂载
```bash
# 查看 UUID
zhou@zhou:/$ sudo blkid
/dev/sdc1: UUID="636cc0df-28f0-431b-aa76-6499bf93090a" TYPE="ext4" PARTUUID="636ee420-01
# 修改 fstab 添加下面一句, 记得创建挂载的目录
UUID=636cc0df-28f0-431b-aa76-6499bf93090a /home/zhou/hisi516 ext4 defaults 0 1
# 先不要重启,测试一下是否修改成功
zhou@zhou:/$ sudo mount -a
zhou@zhou:/$ di
/dev/sdc1 /home/zhou/hisi 47.0G 0.1G 44.5G 5% ext4
# 修改属组
sudo chown -r zhou:zhou hisi516
# 现在表示修改成功了,可以重启测试一下。
编译工具等搭建
himix100交叉编译工具
tar -zxf arm-himix100-linux.tgz
# 分析arm-himix100-linux.install脚本。 然后指定编译的路径 $HOME/hisi516/toolchain/x86-arm
sudo ./arm-himix100-linux.install $HOME/hisi516/toolchain/x86-arm
由于不喜欢修改profile文件,因此指定了~/.bashrc文件。
arm-himix100-linux.sh
测试出现了下面的问题,
zhou@zhou:~/hisi516/toolchain/arm-himix100-linux$ arm-himix100-linux-gcc --version
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.
Aborted (core dumped)
根据_nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))’ failed文章。使用下面的命令即可解决。
export LC_ALL=C
安装SDK
我拿到的一共有以下三个版本的SDK
Hi3516EV200R001C01SPC001
Hi3516EV200R001C01SPC002
Hi3516EV200R001C01SPC011
决定使用Hi3516EV200R001C01SPC011
参考《Hi3516EV200╱Hi3516EV300╱Hi3518EV300 Linux SDK 安装以及升级使用说明.pdf》文档。
zhou@zhou:~/hisi516/sdk$ tar -zxvf Hi3516EV200_SDK_V1.0.1.1.tgz
# 解压内部其他的文件
# 记得修改以下 解释器 #!/bin/bash
zhou@zhou:~/hisi516/sdk/Hi3516EV200_SDK_V1.0.1.1$ sudo ./sdk.unpack
# 文件分布
zhou@zhou:~/hisi516/sdk/Hi3516EV200_SDK_V1.0.1.1$ ls
drv mpp osal osdrv package scripts sdk.cleanup sdk.unpack
zhou@zhou:~/hisi516/sdk/Hi3516EV200_SDK_V1.0.1.1$ tree -L 2
|-- drv # drv 目录
| |-- extdrv # 板级外围驱动源代码
| |-- interdrv # mipi,cipher 等驱动源代码
|-- mpp # 存放单核媒体处理平台的目录
| |-- component # mpp 组件
| | |-- isp # isp 相关组件
| |-- include # 头文件
| |-- init # 内核模块的初始化源代码
| |-- ko # 内核ko 模块
| |-- lib # 用户态 lib 库
| |-- obj # 内核模块的obj 文
| |-- sample # 样例源代码
| |-- tools # 媒体处理相关工具
| |-- cfg.mak # mpp 配置文件
| |-- Makefile.param # mpp 全局编译选项
| |-- Makefile.linux.param # mpp linux 编译选项
|-- osal # 存放操作系统适配层的头文件和源文件的目录
| |-- include # 存放操作系统适配层的头文件的目录
| |-- linux # 存放linux 系统适配层的源文件的目录
|-- osdrv # 存放操作系统及相关驱动的目录
| |-- opensource # opensource 源代码
| | |-- busybox # busybox 源代码
| | |-- kernel # linux 内核源代码
| | |-- uboot # uboot 源代码
| |-- pub # 编译好的镜像、工具、drv 驱动等
| |-- tools # 工具源代码
| |-- readme_cn.txt # osdrv 中文使用说明
| |-- readme_en.txt # osdrv 英文使用说明
| |-- ...... #
| |-- Makefile # osdrv Makefile
|-- package # 存放SDK 各种压缩包的目录
| |-- drv.tgz # drv 压缩包
| |-- mpp.tgz # 媒体处理平台软件压缩包
| |-- osal.tgz # 操作系统适配层源码压缩包
| |-- osdrv.tgz # linux 内核/uboot/rootfs/tools 源码压缩包
| |-- rootfs_uclibc.tgz # 文件系统相关源文件压缩包
| |-- image_* # 可供 FLASH 烧写的映像文件(如内核、根文件系统)和rootfs 的压缩包
|-- scripts # 存放shell 脚本的目录
|-- sdk.cleanup # SDK 清理脚本
|-- sdk.unpack # SDK 展开脚本
烧写程序
我们拿到板子有两种情况,无u-boot以及有u-boot的情况。
tftpd32 服务器搭建
无u-boot烧写u-boot
有u-boot的情况
可以按照以下步骤使用网口烧写 uboot、kernel及 rootfs 到 Flash 中。
# 设置 serverip(即 tftp 服务器的 ip)、ipaddr(单板ip)和 ethaddr(单板的 MAC 地址)。
# 开机启动,进入u-boot控制界面
# 我主机win10的IP地址
setenv serverip 192.168.1.102
# 设置hisi开发板的地址
# 记得修改NFS的访问地址
setenv ipaddr 192.168.1.199
# 修改MAC地址,这个可以随意
setenv ethaddr 32:34:46:78:9A:DC
# 没什么好说的
setenv netmask 255.255.255.0
# 大部分情况下都是路由器的IP地址,除非您没有和路由器连接
setenv gatewayip 192.168.1.1
# 习惯性的保存,当然也可以不保存
saveenv
# 查看变量
printenv
上面我们设置好了环境变量,下一步就是将对应的二进制文件读取到内存中,然后烧写到Flash中。那么就存在两个问题。烧写到内存那个位置? 以及烧写到Flash的那个位置?
确定Flash分区
我拿到的开发板是32M的FLash。不过由于对应的数据手册里面只讲了16M的FLash分配表。没有讲32M的。那么首先我们应该确定这32M的分区。然后参照手册来烧写命令。u-boot启动时,进入命令行。
# 输出环境变量
hisilicon # printenv
bootargs=mem=40M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=squashfs mtdparts=hi_sfc:384K(boot),2M(kernel),2M(rootfs),5M(appfs),384K(param)
# 请注意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
TIPS:<br />由于没有找到对应的资料。关于rootfs的存放地址。观察海思的提供的资料,都是内核后面紧跟着rootfs。因此我也默认这样,希望以后能够找到对应的证据。
<a name="eG3Qf"></a>
## 测试板卡是否正常
打开VLC media player,选择打开网络串流。确定开发板的IP地址。这个命令不具有普遍性。
```c
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将其复制到
osdrv/opensource/kernel 文件夹
# 解压
zhou@zhou:~/hisi516/sdk/Hi3516EV200_SDK_V1.0.1.1/osdrv/opensource/kernel$ tar -zxvf linux-4.9.37.tar.gz
# 重命名一下
mv linux-4.9.37 linux-4.9.y
# 切换一下目录
cd linux-4.9.y
# 打补丁
patch -p1 < ../linux-4.9.37.patch
# 回到刚才目录
cd ..
# 重新保存一下
tar -czf linux-4.9.y.tgz linux-4.9.y
# 又进入内核目录
cd linux-4.9.y/
# 复制.config
cp arch/arm/configs/hi3516ev200_full_defconfig .config
# 即使不修改也要打开 menuconfig 一次
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- menuconfig
# 编译
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- uImage
u-boot-2016.11
tar -zxvf u-boot-2016.11.tgz
# Flash启动
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- hi3516ev200_defconfig
# (emmc启动时执行如下操作:make ARCH=arm CROSS_COMPILE=arm-himix100-linux- hi3516ev200_emmc_defconfig)
# 编译
make ARCH=arm CROSS_COMPILE=arm-himix100-linux-
# 编译hi_gzip 如果这里编译出错,可以自己手动去编译
make -C ../../../tools/pc/hi_gzip
# 复制 gzip
cp ../../../tools/pc/hi_gzip/bin/gzip arch/arm/cpu/armv7/hi3516ev200/hw_compressed/ -rf
现在需要在win10上,使用excel生成 reg_info.bin,然后将其重命名为 .reg
这一步暂时还不知道怎么处理,但是海思内核提供了对应的u-boot。暂时只能先将就直接使用现成的.bin文件
cp reg_info.bin .reg
# 最后将.reg 复制到boot源代码目录下
# 最后编译
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- u-boot-z.bin
#
文件系统
gdb-7.9.1
https://mirrors.sjtug.sjtu.edu.cn/gnu/
gdb-7.9.1.tar.gz
ncurses-6.0.tar.gz
gdbserver调试
# 在目标板上面 等待主机的连接
gdbserver :2000 hello &
# 主机上面调用
## 首先启动gdb
gdb
## 与目标机连接
target remote 192.168.0.5:2000 # 2000 /*192.168.0.5为单板IP*/
remote debugging using 10.70.153.100:2000
0x40000a70 in ?? () # 连接成功以后会出现上面的提示
##
add-symbol-file hello 40000a70
## 或者可以使用 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
export LANG=C
/bin/sh: 1: pushd: not found
/bin/sh: 2: ./configure: not found
编译错误: /bin/sh: 1: pushd: not found的问题
sudo ln -s /bin/bash /bin/sh
NFS网络启动
首先使用jffs2_mount_mtdram.sh挂载文件系统。 jffs2的。将所有的文件复制到/home/zhou/hisi516/sysroot
,并且递归修改所有文件属组。
zhou@zhou:~/hisi516/sysroot$ sudo chown zhou:zhou * -R
然后将/home/zhou/hisi516/sysroot
开启NFS。
cat /etc/exports
/home/zhou/hisi516/sysroot *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
# 重启NFS
sudo systemctl restart nfs-kernel-server
# 先在开发板上面测试
mount -t nfs -o nolock,vers=3 192.168.1.15:/home/zhou/hisi516/sysroot /root/NFS
- 修改bootargs
参考Linux内核文件Documentation\filesystems\nfs\nfsroot.txt
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:
<dns0-ip>:<dns1-ip>
# 最终bootargs
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文件,其他的东西,比如内核,文件系统是否使用自己编译不重要。
# 首先挂载NFS
mount -t nfs -o nolock,vers=3 192.168.1.15:/home/zhou/hisi516/sysroot/root/NFS /root/NFS
# 复制的目的路径看您怎么设置了
# 将编译好的所有Hi3516EV200_SDK_V1.0.1.1/mpp/ko/的所有文件复制到 开发板的 /app/komod
zhou@zhou:~/hisi516/sdk/Hi3516EV200_SDK_V1.0.1.1/mpp/ko$ ls
extdrv hi3516ev200_aenc.ko hi3516ev200_base.ko hi3516ev200_isp.ko hi3516ev200_rgn.ko hi3516ev200_venc.ko hi3516ev200_vpss.ko hi_osal.ko load3516ev200
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
hi3516ev200_adc.ko hi3516ev200_aio.ko hi3516ev200_h264e.ko hi3516ev200_jpege.ko hi3516ev200_tde.ko hi3516ev200_vi.ko hi_cipher.ko hifb.ko load3518ev300
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 安装以及升级使用说明》