1. Hi3516EV200开发环境概述
Hi3516EV200是海思半导体推出的一款高性能视频处理芯片,广泛应用于安防监控、智能门禁等嵌入式视觉领域。作为一款ARM架构的SoC,其开发环境配置与传统x86平台存在显著差异,核心在于交叉编译工具链的搭建。
这块芯片的典型应用场景包括:
- 1080P@30fps视频编码
- 智能分析算法部署
- 低功耗边缘计算设备
开发板通常配备:
- 64MB DDR3内存
- SPI Nor/NAND Flash存储
- 丰富的外设接口(USB、以太网等)
2. 基础环境准备
2.1 宿主机构建要求
推荐使用Ubuntu 16.04 xenial作为开发主机系统,这是海思官方SDK验证过的环境。关键配置步骤包括:
- 切换默认shell为bash:
sudo dpkg-reconfigure dash # 选择"No"- 安装基础依赖包:
sudo apt install libncurses5-dev make libc6 lib32z1 lib32stdc++6 \ zlib1g-dev ncurses-term libncursesw5-dev g++ u-boot-tools \ liblzo2-dev uuid-dev pkg-config texinfo texlive gperf \ bison gawk curl upx pngquant flex libnl-3-dev libdbus-1-dev注意:必须安装32位兼容库(lib32z1等),因为部分工具链组件仍依赖32位环境
2.2 交叉编译工具链部署
海思提供的arm-himix100-linux工具链包含:
- GCC 6.3.0
- uClibc C库
- 针对Hi3516EV200优化的指令集支持
安装步骤:
tar zxvf arm-himix100-linux.tgz chmod +x arm-himix100-linux/arm-himix100-linux.install cd arm-himix100-linux && ./arm-himix100-linux.install验证安装:
arm-himix100-linux-gcc -v # 应显示gcc version 6.3.03. SDK编译与配置
3.1 源码目录结构解析
典型SDK包(如Hi3516EV200_SDK_V1.0.1.2.tgz)解压后包含:
├── osdrv # 操作系统驱动 │ ├── opensource # 开源组件(内核等) │ └── pub # 编译输出目录 ├── mpp # 媒体处理平台 │ ├── ko # 内核模块 │ └── sample # 示例代码 └── package # 第三方软件包3.2 完整编译流程
- 解压SDK:
tar zxvf Hi3516EV200_SDK_V1.0.1.2.tgz cd Hi3516EV200_SDK_V1.0.1.2 ./sdk.unpack- 内核编译注意事项:
cd osdrv/opensource/kernel/linux-4.9.y make ARCH=arm CROSS_COMPILE=arm-himix100-linux- menuconfig # 关键配置项: # CONFIG_EXTRA_FIRMWARE="mt7601u.bin" # CONFIG_MT7601U=m make ARCH=arm CROSS_COMPILE=arm-himix100-linux- uImage -j$(nproc)- 完整系统编译:
cd osdrv make all # 不要使用-j参数,避免并行编译错误常见问题:编译失败时,建议手动执行最后报错的命令,去掉输出重定向(>/dev/null)查看详细错误信息
4. 外设驱动集成
4.1 MT7601U无线网卡支持
- 固件集成:
cp DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/mcu/bin/MT7601.bin \ osdrv/opensource/kernel/linux-4.9.y/firmware/mt7601u.bin- 内核配置关键项:
Device Drivers → Network device support → Wireless LAN [*] MediaTek devices <M> MediaTek MT7601U (USB) support- 驱动加载测试:
insmod /ko/mt7601u.ko dmesg | grep mt7601u # 查看驱动加载日志4.2 网络工具链编译
4.2.1 wpa_supplicant套件
依赖库编译顺序:
- OpenSSL (静态编译):
./config no-asm no-shared no-async --prefix=$PWD/../install/libssl \ --cross-compile-prefix=arm-himix100-linux-- libnl 3.x:
./configure --host=arm-himix100-linux --prefix=$PWD/../install/libnl \ --enable-static- wpa_supplicant配置要点:
# 在.config中添加: CFLAGS += -I/path/to/openssl/include LIBS += -L/path/to/openssl/lib -lcrypto -lssl CC = arm-himix100-linux-gcc4.2.2 文件传输工具lrzsz
交叉编译配置:
CC=arm-himix100-linux-gcc ./configure \ --host=arm-himix100-linux \ --prefix=$PWD/_install \ --cache-file=./arm-himix100-linux.cache5. 系统烧写与调试
5.1 烧录镜像说明
关键镜像文件:
u-boot-hi3516ev200.bin:BootloaderuImage_hi3516ev200:Linux内核rootfs_hi3516ev200_64k.jffs2:JFFS2格式根文件系统
HiTool烧录配置示例:
| 分区名 | 偏移地址 | 大小 | 文件类型 |
|---|---|---|---|
| fastboot | 0x000000 | 1MB | SPI Nor |
| kernel | 0x100000 | 4MB | SPI Nor |
| rootfs | 0x500000 | 27MB | SPI Nor |
5.2 U-Boot环境配置
关键启动参数:
setenv bootargs 'mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 \ rootfstype=jffs2 rw mtdparts=hi_sfc:1M(boot),4M(kernel),27M(rootfs)' setenv bootcmd 'sf probe 0;sf read 0x42000000 0x100000 0x400000;bootm 0x42000000' saveenv内存分配提示:总内存64MB中,32MB分配给OS,剩余32MB留给MMZ(媒体内存区域)
6. 网络配置实战
6.1 WiFi连接自动化脚本
示例/etc/init.d/S80wireless:
#!/bin/sh wlandev=wlan0 phyaddr=7C:A7:B0:F6:E4:10 ipaddr=192.168.1.54 netmask=255.255.255.0 gateway=192.168.1.1 ifconfig $wlandev up ifconfig $wlandev hw ether $phyaddr ifconfig $wlandev $ipaddr netmask $netmask route add default gw $gateway wpa_supplicant -D nl80211 -i $wlandev -c /etc/wpa_supplicant.conf -B6.2 NFS开发环境搭建
- 服务端配置(Ubuntu):
sudo apt install nfs-kernel-server echo "/nfs_root 192.168.1.*(rw,sync,no_root_squash)" | sudo tee -a /etc/exports sudo exportfs -a- 客户端挂载(开发板):
mount -t nfs -o nolock,tcp,rsize=32768,wsize=32768 \ 192.168.1.141:/nfs_root /mnt7. 开发调试技巧
7.1 串口调试要点
- 波特率:115200
- 数据位:8
- 停止位:1
- 无校验
- 硬件流控:关闭
对于未引出TTL接口的开发板,可焊接:
- TX:靠近晶振的测试点
- RX:相邻测试点
- GND:任意接地孔
7.2 常见问题排查
- 内核启动卡住:
- 检查bootargs中的MTD分区设置是否与实际烧录一致
- 确认rootfstype参数匹配文件系统类型(jffs2/yaffs2等)
- WiFi连接失败:
dmesg | grep mt7601u # 检查驱动加载 iwconfig wlan0 # 检查射频状态 wpa_cli status # 查看认证状态- 内存不足问题:
- 调整mem参数(如mem=48M)
- 优化MMZ内存分配:
echo "mmz=ddr,0,0x85000000,64M" > /proc/media-mem