1. 虚拟机配置
开发环境的网络需要满足三端连接,电脑、虚拟机、开发板,并且虚拟机能上网,所以使用桥接方式,编辑虚拟机linux网络设置,可用命令行vi /etc/network/interface
,在该配置文件中填写虚拟机ip配置,注意除ip外,其他网络配置须与主机完全一致。也可使用ubuntu图形化界面配置,配置好后重启网络,
1 | ifconfig eth0 down |
正常情况应能连接,若不能,检查虚拟机网络设置。
先ping主机ip,看是否连通,再ping 百度,看DNS是否可用,最后打开浏览器看是否能上网。若不能上网
1 | vi /etc/nsswitch.conf |
将红框删除。再次重启,查看是否能上网。若仍不能
1 | vi /etc/resovconf/resolv.conf.d/base |
添加
1 | nameserver 223.5.5.5 |
更新resolv.conf
1 | resolvconf -u |
如果还是不能,出现能ping通baidu.com,但是网页不能访问,检查浏览器代理!
ps:开发板接路由器,电脑可连路由器wifi或网线,通过路由器转发通信。
2. tftp
- 安装tftp和xinetd
1 | sudo apt-get install xinetd |
更改tftpd-hpa配置文件vi /etc/default/tftpd-hpa
1 | TFTP_USERNAME="tftp" |
其中TFTP_DIRECTORT是tftp服务器的工作目录,根据自己配置的更改。
更改该目录的权限,方便客户端修改
1 | chmod 777 /srv/tftpd -R |
编辑/etc/xinetd.d/tftp,如果没有tftp文件就新建一个,写入以下内容
1 | service tftp |
然后重新启动tftp和xinetd
1 | service tftpd-hpa restart |
测试tftp
在/srv/tftpd目录(即tftp服务器目录)下新建一个文件,如a.c
,在另一终端输入
1 | root@:tftp localhost |
上述情况则为成功。
- 连接编译服务器
配置服务器端VPN,使用secureCRT软件,新建一个ssh2连接
所有编译任务都在 服务器上完成,节约时间。
文件传输:
服务器到本地
1 | scp -P 22 usr@serverip:serverfiledir localfiledir |
3. 安装交叉编译链
配置bash
1 | #查看是否是bash |
添加可能需要的依赖,没有这些库后面会有非常多BUG
1 | sudo apt-get install ncurses-dev build-essential u-boot-tools libusb-1.0-0 libusb-1.0-0-dev git wget fakeroot kernel-package zlib1g-dev libncurses5-dev cvs automake autoconf libtool bison flex |
进入SDK目录,解压安装arm-linux和aarch64-himix交叉编译链
1 | tar -zxf gcc-arm-none-eabi-4_9-2015q3.tgz |
4. 编译
- kernel编译
先打补丁,方法如下(readme_cn.txt)
1 | 1、从linux开源社区下载v4.9.37版本的内核: |
配置并编译
1 | ZEUS/ZEUS_V2.1_SDK/osdrv/opensource/kernel/linux-4.9.y |
生成的uImage在arch/arm64/boot
下,生成的fip.bin在./build/hi3559av100/debug
下。
- 编译时错误
- 无法生成uImage
1 | /linux-4.9.y_multi-core/arch/arm64/boot/uImage: No such file or directory |
原因是缺少mkimage工具,从osdrv/tools/pc/mkimgage_tool
下将其拷贝至/usr/bin
。
确认mkimage工具可用后,仍然有错,往上检查,发现另一个问题。
- 头文件找不到路径
先检查Makefile,发现Makefile中并没有与报错相关的路径,使用find找到头文件目录,检查该目录下和与之相关联目录下文件,发现问题出在hi3559av100.dtsi ,编辑1
2
3ZEUSAI\ZEUSAISDK\ZEUS_V2.1_SDK\osdrv\opensource\kernel\linux-4.9.y\arch\arm64\boot\dts\hisilicon\hi3559av100.dtsi
dt-bindings/clock/hi3559av100-clock.h
更改头文件,相对路径写全即可。
这是分开编译内核的结果。
全部编译。
- 制作根文件系统
1 | cd /home/sysong/ZEUS/ZEUS_V2.1_SDK/osdrv/tools/pc/ext4_utils |
privatefs.ext4配置目录如下,在该Makefile下可更改privatefs的生成大小。
1 | /ZEUS/ZEUS_V2.1_SDK/references/db_reference/product/hi3559av100/rootfs/Makefile |
5. 烧写
首先HiTool烧写uboot,烧写完毕后使用tftp烧写其他的。
命令含义:
1 | mw.b 0x42000000 0xff 0x400000 |
开始烧写
1 | u-boot |
设置启动选项
1 | setenv bootargs 'mem=512M lpj=599654 console=ttyAMA0 root=/dev/mmcblk0p3 rootfstype=ext4 rw rootwait blkdevparts=mmcblk0:1M(u-boot-hi3559av100.bin),16M(uImage_hi3559av100_multi-core),1024M(rootfs.ext4)' |
- 启动报错
1 | /bin/sh: error while loading shared libraries: libm.so.6: cannot open shared object file: No such file or directory |
大概是根文件系统出了问题,来到编译好的根文件目录,查看是否有libm.so.6
。经检查发现是一个软链接文件,怀疑是编译时新增的文件,而链接未更正。
1 | ln -sf libm.2-24.so libm.so.6 |
但是还是不行,再去看这个软链接ls -al
,发现并没有指错。。。
找了半天问题所在,突然想到会不会是读取的动态库目录不是/lib ,然后发现/usr/lib下没有文件,将/lib下的库文件拷贝过去,上电成功挂载文件系统。可能是原来配置的内核没有user。
内核映射表
1 | Virtual kernel memory layout: |
6. NFS
检查开发板网络,网络需要配置,修改/etc/init.d/S80network
,添加如下代码
1 | #!/bin/sh |
配置NFS
1 | sudo apt-get install nfs-kernel-server |
1 | vi /etc/exports |
启动NFS
1 | /etc/init.d/nfs-kernel-server start |
客户端挂载
1 | mount [-t nfs] -o nolock 192.168.51.22:/nfs /nfsroot |
挂载NFS失败
1 | erro1 Permission denied |
7. 验证sample
1 | cp cfg.mak.multicore to cfg.mak |
运行sample
编译好后,将编译后的sample目录挂载到开发板上,选择一个不需要其他输入的例程
1 | ./sample_tde 1 |
报错
1 | open sys: No such file or directory |
查看了sys目录,应该没问题,发现需要加载模块文件
1 | cd mmp/out/linux/ko |
报错
1 | /nfsroot/sample/out/ko # modprobe hi3559av100_tde.ko |
显示内核没有这些符号表,先看看内核表是否真的没有这些符号
1 | cat -n opensource/kernel/linux-4.9.y/System.map | grep osal_dmb |
发现确实没有生成,可能是Makefile错了,也可能是编译时没有导出符号表。
查找这些函数定义的位置
1 | grep -r osal_dmb * |
说明导出了符号表,那么就是没有被编译了,检查Makefile
该目标文件是固定会编译的,并没有条件编译。查看其上级Makefile,看是在哪个地方被编译的。在mpp下的makefile中发现该路径,该路径被导出,那应该就是这个位置开始编译。而mpp并未编译进内核,说明该模块确实没编译进内核。
进入ko文件目录,仔细一看还有两个load文件,应该是要用这个文件手动导入模块。但是并没有在手册上看到。。。浪费好多时间。
1 | ./load3559av100_multicore -i -sensor0 imx327 |
至此成功运行sample。
自动加载模块
1 | vi /etc/moudles |
Reference
[1] Hi3559A╱C V100 开发环境用户指南
[2] ZEUSAI+智能计算平台-快速开发指南v2.4
[3] HiBurn 工具使用指南