海思3559A系统移植

1. 虚拟机配置

开发环境的网络需要满足三端连接,电脑、虚拟机、开发板,并且虚拟机能上网,所以使用桥接方式,编辑虚拟机linux网络设置,可用命令行vi /etc/network/interface,在该配置文件中填写虚拟机ip配置,注意除ip外,其他网络配置须与主机完全一致。也可使用ubuntu图形化界面配置,配置好后重启网络,

1
2
3
4
ifconfig eth0 down 
ifconfig eth0 up
#or
/etc/init.d/networking restart

正常情况应能连接,若不能,检查虚拟机网络设置。

先ping主机ip,看是否连通,再ping 百度,看DNS是否可用,最后打开浏览器看是否能上网。若不能上网

1
vi /etc/nsswitch.conf

将红框删除。再次重启,查看是否能上网。若仍不能

1
vi /etc/resovconf/resolv.conf.d/base

添加

1
2
3
nameserver 223.5.5.5
nameserver 8.8.8.8
nameserver 192.168.50.1 #自己主机的DNS

更新resolv.conf

1
resolvconf -u

如果还是不能,出现能ping通baidu.com,但是网页不能访问,检查浏览器代理!

ps:开发板接路由器,电脑可连路由器wifi或网线,通过路由器转发通信。

2. tftp

  • 安装tftp和xinetd
1
2
3
4
5
6
sudo apt-get install xinetd
sudo apt-get install tftpd-hpa tftp-hpa
#删除standalone启动方式
update-rc.d -f tftpd-hpa remove
#编辑/etc/inetd.conf,添加如下
tftp dgram udp wait root /usr/sbin/tcpd /usr/sbin/in.tftpd -s /srv/tftpd

更改tftpd-hpa配置文件vi /etc/default/tftpd-hpa

1
2
3
4
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftpd"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"

其中TFTP_DIRECTORT是tftp服务器的工作目录,根据自己配置的更改。

更改该目录的权限,方便客户端修改

1
chmod 777 /srv/tftpd -R

编辑/etc/xinetd.d/tftp,如果没有tftp文件就新建一个,写入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
service tftp
{
disable = no
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /srv/tftpd -c
per_source = 11
cps = 100 2
flags =IPv4
}

然后重新启动tftp和xinetd

1
2
service tftpd-hpa restart
service xinetd restart

测试tftp

在/srv/tftpd目录(即tftp服务器目录)下新建一个文件,如a.c,在另一终端输入

1
2
3
root@:tftp localhost
tftp> get a.c
tftp>

上述情况则为成功。

  • 连接编译服务器

配置服务器端VPN,使用secureCRT软件,新建一个ssh2连接

所有编译任务都在 服务器上完成,节约时间。

文件传输:

服务器到本地

1
scp -P 22 usr@serverip:serverfiledir localfiledir

3. 安装交叉编译链

配置bash

1
2
3
4
5
6
7
8
9
10
11
#查看是否是bash
ls -l /bin/sh

sudo dpkg-reconfigure dash
#选择not
sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.6-base:i386 libstdc++5:i386 libstdc++6:i386
sudo apt-get install zlib1g-dev
sudo apt-get install libncurses5-dev
sudo apt-get install build-essential
sudo apt-get install lib32z1
sudo apt-get install libssl-dev

添加可能需要的依赖,没有这些库后面会有非常多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
2
3
4
5
6
7
8
tar -zxf gcc-arm-none-eabi-4_9-2015q3.tgz
chomod +x gcc-arm-none-eabii-4_9-2015q3.install
sudo ./gcc-arm-none-eabi-4_9-2015q3.install
tar -zxf aarch64-himix100-linux.tgz
chomod +x aarch64-himix100-linux.install
sudo ./aarch64-himix100-linux.install
#更新环境变量
source /etc/profile

4. 编译

  • kernel编译

先打补丁,方法如下(readme_cn.txt)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1、从linux开源社区下载v4.9.37版本的内核:
1)进入网站:www.kernel.org
2)选择HTTP协议资源的https://www.kernel.org/pub/选项,进入子页面
3)选择linux/菜单项,进入子页面
4)选择kernel/菜单项,进入子页面
5)选择v4.x/菜单项,进入子页面
6)下载linux-4.9.37.tar.gz(或linux-4.9.37.tar.xz)

2、打补丁
1)将下载的 linux-4.9.37.tar.gz 存放到 osdrv的opensource/kernel目录中
2)在linux服务器中进入 osdrv 的根目录,执行如下命令:
cd opensource/kernel
tar -zxf 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 ../../

1)将下载的 linux-4.9.37.tar.gz 存放到 osdrv的opensource/kernel目录中
2)在linux服务器中进入 osdrv 的根目录,执行如下命令:
make atf

注意:
若下载的内核格式为linux-4.9.37.tar.xz,
第一步先用:
xz -d linux-4.9.37.tar.xz
命令将linux-4.9.37.tar.xz解压为linux-4.9.37.tar。
第二步再用:
tar -xvf linux-4.9.37.tar
解压linux-4.9.37.tar。

配置并编译

1
2
3
4
5
6
7
#ZEUS/ZEUS_V2.1_SDK/osdrv/opensource/kernel/linux-4.9.y
cp arch/arm64/configs/hi3559av100_arm64__big_little_defconfig .config
make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux- menuconfig

make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux- uImage -j 20
cd osdrv/opensource/arm-trusted-firmware/arm-trusted-firmware
./mk.sh

生成的uImage在arch/arm64/boot下,生成的fip.bin在./build/hi3559av100/debug下。

  • 编译时错误
  1. 无法生成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工具可用后,仍然有错,往上检查,发现另一个问题。

  1. 头文件找不到路径

先检查Makefile,发现Makefile中并没有与报错相关的路径,使用find找到头文件目录,检查该目录下和与之相关联目录下文件,发现问题出在hi3559av100.dtsi ,编辑

1
2
3
ZEUSAI\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
2
3
4
cd /home/sysong/ZEUS/ZEUS_V2.1_SDK/osdrv/tools/pc/ext4_utils
make clean
make
./bin/make_ext4fs -s -l 1024M rootfs_hi3559av100_1024M.ext4 /home/sysong/ZEUS/ZEUS_V2.1_SDK/osdrv/pub/rootfs_glibc_multi-core_arm64

privatefs.ext4配置目录如下,在该Makefile下可更改privatefs的生成大小。

1
/ZEUS/ZEUS_V2.1_SDK/references/db_reference/product/hi3559av100/rootfs/Makefile

5. 烧写

首先HiTool烧写uboot,烧写完毕后使用tftp烧写其他的。

命令含义:

1
2
3
4
5
6
7
8
9
10
11
12
mw.b 0x42000000 0xff 0x400000
#mw.b 以字节为单位写内存
#0x42000000 起始地址
#0xff 写为ff,即置1
#0x400000 长度
tftp 0x42000000 uImage
#tftp下载uImage到0x42000000
mmc write 0 42000000 0x800 0x8000
#42000000文件所在位置
#800 起始位置,8000长度

#起始地址和长度按块计算,一块=512B

开始烧写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#u-boot
mw.b 0x42000000 0xff 0x100000
tftp 0x42000000 u-boot-hi3559av100.bin
mmc write 0 0x42000000 0x0 0x800

#kernel
mw.b 0x42000000 0xff 0x400000
tftp 0x42000000 uImage
mmc write 0 0x42000000 0x800 0x8000

#rootfs
mw.b 0x42000000 0xff 0x4000000
tftp 0x42000000 rootfs_hi3559av100_1024M.ext4
mmc write.ext4sp 0 0x42000000 0x8800 0x200000 #1024M

#privatefs
mw.b 0x42000000 0xff 0x8000000
tftp 0x42000000 privatefs.ext4
mmc write.ext4sp 0 0x42000000 0x208800 0x200000 #1024

设置启动选项

1
2
3
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)'
setenv bootcmd 'mmc read 0 45000000 0x800 0x8000;bootm 45000000'
sav
  • 启动报错
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
2
ln -sf libm.2-24.so libm.so.6
#强制指过去

但是还是不行,再去看这个软链接ls -al,发现并没有指错。。。

找了半天问题所在,突然想到会不会是读取的动态库目录不是/lib ,然后发现/usr/lib下没有文件,将/lib下的库文件拷贝过去,上电成功挂载文件系统。可能是原来配置的内核没有user。

内核映射表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Virtual kernel memory layout:
modules : 0xffffff8000000000 - 0xffffff8008000000 ( 128 MB)
vmalloc : 0xffffff8008000000 - 0xffffffbebfff0000 ( 250 GB)
.text : 0xffffff8008080000 - 0xffffff80086c0000 ( 6400 KB)
.rodata : 0xffffff80086c0000 - 0xffffff8008890000 ( 1856 KB)
.init : 0xffffff8008890000 - 0xffffff80088f0000 ( 384 KB)
.data : 0xffffff80088f0000 - 0xffffff8008947808 ( 351 KB)
.bss : 0xffffff8008947808 - 0xffffff8008997124 ( 319 KB)
fixed : 0xffffffbefe7fb000 - 0xffffffbefec00000 ( 4116 KB)
PCI I/O : 0xffffffbefee00000 - 0xffffffbeffe00000 ( 16 MB)
vmemmap : 0xffffffbf00000000 - 0xffffffc000000000 ( 4 GB maximum)
0xffffffbf00100000 - 0xffffffbf00900000 ( 8 MB actual)
memory : 0xffffffc004000000 - 0xffffffc024000000 ( 512 MB)
SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1

6. NFS

检查开发板网络,网络需要配置,修改/etc/init.d/S80network,添加如下代码

1
2
3
4
5
6
7
8
9
#!/bin/sh

ipaddr=192.168.51.11
bootp=
gateway=192.168.51.1
netmask=255.255.255.0
hostname=HI3559A
netdev=eth0
autoconf=true

配置NFS

1
2
3
sudo apt-get install nfs-kernel-server
sudo apt-get install nfs-common
sudo service nfs-kernel-server restart
1
2
3
4
5
6
vi /etc/exports
##添加
/nfs *(rw,sync,no_root_squash)

##使其生效
export -rf

启动NFS

1
2
3
/etc/init.d/nfs-kernel-server start
#up on boot
chkconfig nfs-kernel-server on

客户端挂载

1
2
3
mount [-t nfs] -o nolock 192.168.51.22:/nfs /nfsroot
#unmount /nfsroot
#vi /etc/rc.local 添加命令可开机自动挂载

挂载NFS失败

1
2
3
4
5
6
#erro1 Permission denied
vi /etc/exports
#上面已更正,非允许用户
#挂载时最好使用root用户
#erro2 No route to host
检查网关是否在同一网段

7. 验证sample

1
2
3
cp  cfg.mak.multicore to cfg.mak
cd sample
make

运行sample

编译好后,将编译后的sample目录挂载到开发板上,选择一个不需要其他输入的例程

1
./sample_tde 1

报错

1
open sys: No such file or directory

查看了sys目录,应该没问题,发现需要加载模块文件

1
2
3
4
5
cd mmp/out/linux/ko
cp -r * /lib/module/#uname -r#/
depmod #生成依赖关系
modprobe sys_config
modprobe hi3559av100_tde

报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/nfsroot/sample/out/ko # modprobe hi3559av100_tde.ko 
hi3559av100_tde: Unknown symbol osal_deregisterdevice (err 0)
hi3559av100_tde: Unknown symbol CMPI_UnRegisterModule (err 0)
hi3559av100_tde: Unknown symbol osal_spin_unlock_irqrestore (err 0)
hi3559av100_tde: Unknown symbol CMPI_Remap_Nocache (err 0)
hi3559av100_tde: Unknown symbol osal_request_irq (err 0)
hi3559av100_tde: Unknown symbol CMPI_MmzMalloc (err 0)
hi3559av100_tde: Unknown symbol osal_platform_driver_unregister (err 0)
hi3559av100_tde: Unknown symbol osal_platform_get_resource_byname (err 0)
hi3559av100_tde: Unknown symbol hil_map_mmz_check_phys (err 0)
hi3559av100_tde: Unknown symbol CMPI_Unmap (err 0)
hi3559av100_tde: Unknown symbol osal_kfree (err 0)
hi3559av100_tde: Unknown symbol osal_atomic_set (err 0)
hi3559av100_tde: Unknown symbol osal_atomic_init (err 0)
hi3559av100_tde: Unknown symbol osal_wait_init (err 0)
hi3559av100_tde: Unknown symbol osal_memset (err 0)
hi3559av100_tde: Unknown symbol osal_memcpy (err 0)
hi3559av100_tde: Unknown symbol osal_registerdevice (err 0)
hi3559av100_tde: Unknown symbol osal_div_u64_rem (err 0)
hi3559av100_tde: Unknown symbol osal_seq_printf (err 0)
hi3559av100_tde: Unknown symbol osal_platform_get_irq_byname (err 0)
hi3559av100_tde: Unknown symbol osal_wait_timeout_interruptible (err 0)
hi3559av100_tde: Unknown symbol osal_createdev (err 0)
hi3559av100_tde: Unknown symbol osal_spin_lock_init (err 0)
hi3559av100_tde: Unknown symbol osal_in_interrupt (err 0)
hi3559av100_tde: Unknown symbol osal_ioremap_nocache (err 0)
hi3559av100_tde: Unknown symbol osal_kmalloc (err 0)
hi3559av100_tde: Unknown symbol HI_LOG (err 0)
hi3559av100_tde: Unknown symbol osal_wakeup (err 0)
hi3559av100_tde: Unknown symbol CMPI_MmzFree (err 0)
hi3559av100_tde: Unknown symbol osal_wait_destory (err 0)
hi3559av100_tde: Unknown symbol osal_create_proc_entry (err 0)
hi3559av100_tde: Unknown symbol hil_is_phys_in_mmz (err 0)
hi3559av100_tde: Unknown symbol osal_spin_lock_destory (err 0)
hi3559av100_tde: Unknown symbol osal_free_irq (err 0)
hi3559av100_tde: Unknown symbol osal_flush_dcache_area (err 0)
hi3559av100_tde: Unknown symbol osal_atomic_destory (err 0)
hi3559av100_tde: Unknown symbol osal_iounmap (err 0)
hi3559av100_tde: Unknown symbol osal_atomic_inc_return (err 0)
hi3559av100_tde: Unknown symbol osal_msecs_to_jiffies (err 0)
hi3559av100_tde: Unknown symbol osal_atomic_read (err 0)
hi3559av100_tde: Unknown symbol osal_spin_lock_irqsave (err 0)
hi3559av100_tde: Unknown symbol CMPI_RegisterModule (err 0)
hi3559av100_tde: Unknown symbol osal_printk (err 0)
hi3559av100_tde: Unknown symbol osal_dmb (err 0)
hi3559av100_tde: Unknown symbol osal_platform_driver_register (err 0)
hi3559av100_tde: Unknown symbol osal_remove_proc_entry (err 0)
hi3559av100_tde: Unknown symbol osal_deregisterdevice (err 0)
hi3559av100_tde: Unknown symbol CMPI_UnRegisterModule (err 0)
hi3559av100_tde: Unknown symbol osal_spin_unlock_irqrestore (err 0)
hi3559av100_tde: Unknown symbol CMPI_Remap_Nocache (err 0)
hi3559av100_tde: Unknown symbol osal_request_irq (err 0)
hi3559av100_tde: Unknown symbol CMPI_MmzMalloc (err 0)
hi3559av100_tde: Unknown symbol osal_platform_driver_unregister (err 0)
hi3559av100_tde: Unknown symbol osal_platform_get_resource_byname (err 0)
hi3559av100_tde: Unknown symbol hil_map_mmz_check_phys (err 0)
hi3559av100_tde: Unknown symbol CMPI_Unmap (err 0)
hi3559av100_tde: Unknown symbol osal_kfree (err 0)
hi3559av100_tde: Unknown symbol osal_atomic_set (err 0)
hi3559av100_tde: Unknown symbol osal_atomic_init (err 0)
hi3559av100_tde: Unknown symbol osal_wait_init (err 0)
hi3559av100_tde: Unknown symbol osal_memset (err 0)
hi3559av100_tde: Unknown symbol osal_memcpy (err 0)
hi3559av100_tde: Unknown symbol osal_registerdevice (err 0)
hi3559av100_tde: Unknown symbol osal_div_u64_rem (err 0)
hi3559av100_tde: Unknown symbol osal_seq_printf (err 0)
hi3559av100_tde: Unknown symbol osal_platform_get_irq_byname (err 0)
hi3559av100_tde: Unknown symbol osal_wait_timeout_interruptible (err 0)
hi3559av100_tde: Unknown symbol osal_createdev (err 0)
hi3559av100_tde: Unknown symbol osal_spin_lock_init (err 0)
hi3559av100_tde: Unknown symbol osal_in_interrupt (err 0)
hi3559av100_tde: Unknown symbol osal_ioremap_nocache (err 0)
hi3559av100_tde: Unknown symbol osal_kmalloc (err 0)
hi3559av100_tde: Unknown symbol HI_LOG (err 0)
hi3559av100_tde: Unknown symbol osal_wakeup (err 0)
hi3559av100_tde: Unknown symbol CMPI_MmzFree (err 0)
hi3559av100_tde: Unknown symbol osal_wait_destory (err 0)
hi3559av100_tde: Unknown symbol osal_create_proc_entry (err 0)
hi3559av100_tde: Unknown symbol hil_is_phys_in_mmz (err 0)
hi3559av100_tde: Unknown symbol osal_spin_lock_destory (err 0)
hi3559av100_tde: Unknown symbol osal_free_irq (err 0)
hi3559av100_tde: Unknown symbol osal_flush_dcache_area (err 0)
hi3559av100_tde: Unknown symbol osal_atomic_destory (err 0)
hi3559av100_tde: Unknown symbol osal_iounmap (err 0)
hi3559av100_tde: Unknown symbol osal_atomic_inc_return (err 0)
hi3559av100_tde: Unknown symbol osal_msecs_to_jiffies (err 0)
hi3559av100_tde: Unknown symbol osal_atomic_read (err 0)
hi3559av100_tde: Unknown symbol osal_spin_lock_irqsave (err 0)
hi3559av100_tde: Unknown symbol CMPI_RegisterModule (err 0)
hi3559av100_tde: Unknown symbol osal_printk (err 0)
hi3559av100_tde: Unknown symbol osal_dmb (err 0)
hi3559av100_tde: Unknown symbol osal_platform_driver_register (err 0)
hi3559av100_tde: Unknown symbol osal_remove_proc_entry (err 0)
modprobe: can't load module hi3559av100_tde.ko (hi3559av100_tde.ko): unknown symbol in module, or unknown parameter

显示内核没有这些符号表,先看看内核表是否真的没有这些符号

1
2
3
cat -n opensource/kernel/linux-4.9.y/System.map | grep osal_dmb
#开发板下
cat /proc/kallsyms | grep osal_dmb

发现确实没有生成,可能是Makefile错了,也可能是编译时没有导出符号表。

查找这些函数定义的位置

1
grep -r osal_dmb *

说明导出了符号表,那么就是没有被编译了,检查Makefile

该目标文件是固定会编译的,并没有条件编译。查看其上级Makefile,看是在哪个地方被编译的。在mpp下的makefile中发现该路径,该路径被导出,那应该就是这个位置开始编译。而mpp并未编译进内核,说明该模块确实没编译进内核。

进入ko文件目录,仔细一看还有两个load文件,应该是要用这个文件手动导入模块。但是并没有在手册上看到。。。浪费好多时间。

1
./load3559av100_multicore -i -sensor0 imx327

至此成功运行sample。

自动加载模块

1
2
vi /etc/moudles
#add moudle name

Reference

[1] Hi3559A╱C V100 开发环境用户指南

[2] ZEUSAI+智能计算平台-快速开发指南v2.4

[3] HiBurn 工具使用指南