原文链接:http://blog.sina.com.cn/s/blog_4c451e0e0102yai1.html
Ubuntu 16.04x32 + Window 10
操作系统实操。
1. HI3516CV500DMEB VER.A 单板,只有 uboot 2016.11.
2.该板子所拥有的硬件资源如下: ->1.SPI nor flash ,16MB, 64KB(blocksize) ,nor flash型号为:n25q128a13 hisi-sfc hisi_spi_nor.0: n25q128a13 (Chipsize 16 Mbytes, Blocksize 64KiB) ->2.DDE 好像也是16M. hisilicon # bdinfo arch_number = 0x00001F40 boot_params = 0x82000100 DRAM bank = 0x00000000 -> start = 0x80000000 -> size = 0x10000000 ->3.没有nand,emmc 等其他存储设备。 3.该板子其他的软件打印信息: ->1.hisilicon # base Base Address: 0x00000000 hisilicon # bdinfo arch_number = 0x00001F40 boot_params = 0x82000100 DRAM bank = 0x00000000 -> start = 0x80000000 -> size = 0x10000000 eth0name = eth0 ethaddr = aa:aa:aa:aa:aa:aa current eth = eth0 ip_addr = 192.168.1.10 baudrate = 115200 bps TLB addr = 0x8FFF0000 relocaddr = 0x8FF30000 reloc off = 0x0D730000 irq_sp = 0x8FE8FEE0 sp start = 0x8FE8FED0 Early malloc usage: 70 / 2000 ->2.hisilicon # getinfo bootmode spi hisilicon # hisilicon # getinfo nand no find nand //表明没有nand . hisilicon # hisilicon # getinfo spi //spi nor flash 16M Block:64KB Chip:16MB*1 ID:0x20 0xBA 0x18 Name:"N25QL128A" hisilicon # hisilicon # getinfo version version: U-Boot 2016.11 ->3.hisilicon # version U-Boot 2016.11 (Aug 31 2018 - 17:14:28 +0800)hi3516cv500 arm-himix200-linux-gcc (HC&C V100R002C00B020_20180814) 6.3.0 GNU ld (GNU Binutils) 2.29 ->4.hisilicon # print arch=arm baudrate=115200 board=hi3516cv500 board_name=hi3516cv500 bootargs=mem=128M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=hi_sfc:1M(boot),4M(kernel),11M(rootfs) bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000 bootdelay=2 cpu=armv7 ethact=eth0 ethaddr=aa:aa:aa:aa:aa:aa gatewayip=192.168.1.1 ipaddr=192.168.1.10 netmask=255.255.255.0 serverip=192.168.1.141 soc=hi3516cv500 stderr=serial stdin=serial stdout=serial vendor=hisilicon verify=n Environment size: 539/262140 bytes 4.uboot的启动打印信息如下: System startup U-Boot 2016.11 (Aug 31 2018 - 17:14:28 +0800)hi3516cv500 DRAM: 256 MiB Relocation Offset is: 0d730000 Relocating to 8ff30000, new gd at 8fe8fef0, sp at 8fe8fed0 SPI Nor: Check Flash Memory Controller v100 ... Found SPI Nor ID Table Version 1.0 SPI Nor(cs 0) ID: 0x20 0xba 0x18 Block:64KB Chip:16MB Name:"N25QL128A" SPI Nor total size: 16MB NAND: 0 MiB In: serial Out: serial Err: serial Net: eth0 Hit any key to stop autoboot: 0 5.hi3516烧写内核和跟文件系统的命令如下: (可参考:Hi3516CV500╱Hi3516DV300 SDK 安装及升级使用说明.pdf) (但要注意:参考文件是以nand为存储器来举例的,但我们的板子是spi nor flash.所以烧写命令可能不同) ->烧写内核:(/Hi3516CV500_SDK_V2.0.0.1/osdrv/pub/hi3516cv500_spi_smp_image_glibc/uImage_hi3516cv500_smp)
1.mw.b 82000000 ff 400000 2.tftp 82000000 uImage_hi3516cv500_smp 3.sf probe 4.sf erase 100000 400000 5.sf write 82000000 100000 400000 ->烧写跟文件系统:(/Hi3516CV500_SDK_V2.0.0.1/osdrv/pub/rootfs_glibc.tgz)
1.mw.b 82000000 ff 800000 (注意:最后的这个数字范围可以是500000~800000,原因:
跟文件系统为4.1M,所以最小500000,800000是因为实际测试,最大就是这个值)
2.tftp 82000000 rootfs_hi3516cv500_64k.jffs2
(注意:选jffs2,是因为bootargs已经规定了;选择64K,这是因为spi nor flash的block块大小是64KB).
3.sf probe
4.sf erase 500000 B00000
(注意:最后一个数字,是可以变得,我估计只要大于4.1M就行。但这个B00000我实际是可用的,其他没试过。)
5.sf write 82000000 500000 B00000
(注意:最后一个数字,是可以变得,我估计只要大于4.1M就行。但这个B00000我实际是可用的,其他没试过。)
(以上命令中我们使用的是 sf 命令。但参考中使用的是nand 命令。那是因为存储器不同造成的。) nfs 挂载 rootfs_glibc: 先解压 /Hi3516CV500_SDK_V2.0.0.1/osdrv/pub/rootfs_glibc.tgz 然后用 nfs 挂载 rootfs_glibc 目录 把 /Hi3516CV500_SDK_V2.0.0.1/smp/a7_linux/mpp 目录中的 ko 和 lib 拷到 /home/nsc/workspace/rootfs_glibc/ko /home/nsc/workspace/rootfs_glibc/usr/lib 一定要把这个文件的执行权限改了,否则会出现驱动加载失败, 导致用例程序调用 HI_MPI_SYS_Exit API时 open err 错误! $cd /home/nsc/workspace/rootfs_glibc/ko $ sudo chmod 777 load3516cv500 $ sudo gedit /home/nsc/workspace/rootfs_glibc/etc/profile 在最后加入如下内容: cd /ko ./load3516cv500 -i -sensor0 imx327 cd - 6.板子烧写地址空间说明: | 1M | 4M | 11M | (spi nor flash 总共16M) -------------------------------------- | boot | kernel | rootfs |
7.因为spi nor flash 只有16M,不够mpp的相关文件存放,所以在开发阶段,
使用nfs 远程挂在根文件系统。等到开发完毕,我只使用nfs方式挂在mpp相关文件。
8.nfs 远程挂在文件夹形式的根文件系统: 原bootargs为:(这是告诉内核如何从硬件设备中启动rootfs;或者怎么启动rootfs)
bootargs=mem=128M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=hi_sfc:1M(boot),4M(kernel),11M(rootfs) 原bootcmd为: (这是告诉uboot 怎么启动内核,从哪里/设备 中读取内核源码,进行启动) bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000 因为我们只远程挂在根文件系统,所以,我们只需要修改bootargs 就可以。 修改后的bootargs为:(一下是设置命令) setenv bootargs root=/dev/nfs rw nfsroot=192.168.1.141:/work/rootfs_hi/rootfs_glibc ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttyAMA0,115200 mem=64M 注意: 1.bootargs 一定要加上mem=64M。否则内核起不起来。(我猜想海思因为内存要做两用,所以他在内核启动前会校验是否设置的系统的内存分配。否则不启动)
2.因为内核启动需要知道内存是怎么被分配的,就是 系统运行需要多少,mpp视频处理需要多少。这里mem=64M,指的是系统运行需要多少。设置一个就行。因为这里是rootfs启动需要的,所以不需要设置mpp需要的内存。
3.为什么这里是64M,这是因为,这里要和mpp/ko/load3516cv500 文件中的os_mem_size的值一样,或者说只要这两个值一样就行,但因为load3516cv500中设置成了64M,我们懒的该,所以也使用64M.
(而且这是海思分配的,人家考虑的是比较全面的。所以我们按照人家的来就行。) #DDR start:0x80000000, kernel start:0x80000000, OS(64M); MMZ start:0x84000000 mem_total=256
256M, total mem
mem_start=0x80000000
phy mem start
os_mem_size=64
64M, os mem
mmz_start=0x84000000;
mmz start addr
mmz_size=192M;
192M, mmz size
9.
->将mpp/ko 目录拷贝到 rootfs 的根目录下(也就是/ko).
->将mpp/lib/* 目录下的.so动态库文件拷贝到 rootfsd的/usr/lib/目录下,这样系统会首先自动在这个文件里搜素到他需要的动态库。(当然我们也可以将lib存放的目录设置为系统自动搜素目录)。
A. 在rootfs 中的 /etc/profile(这是系统执行登录的操作文件) 的文件末尾加上:
->1.vi /etc/profile
添加内容如下:
cd /ko
(我们将ko目录放到根目录下)
./load3516cv500 -i -sensor0 imx327
cd -
->2.修改 /ko/load3516cv500文件的文件权限,增加可执行权限:
chmod 777 load3516cv500
B. reboot 或者重新上电重启,就ok.
C.制作新的jffs2文件系统:
sudo osdrv/pub/bin/pc/mkfs.jffs2
-d osdrv/pub/rootfs_glibc -l -e 0x10000 -o osdrv/pub/rootfs_glibc_64k.jffs2
疑问: -l 什么意思?? -e 0x10000 什么意思??
D.直接在sample 的某个目录下 make,比如 :venc ,直接在它下面make ,就可以得到 一个可以执行程序,拿到 板子中直接运行就行。
E.vi /etc/profile 末尾添加:
sleep 1
mount -t nfs -o nolock -o tcp -o rsize=32768,wsize=32768 192.168.1.141:/work/rootfs_hi
/mnt
cd /root
./loadmpp.sh
cd -
vi loadmpp.sh
#!/bin/sh
cd /mnt/mpp/ko
./load3516cv500 -i -sensor0 imx327
(这个可能有变,尝试之后,不行在换另一个。)
cd -
F.因为spi nor flash 供 16M,而且没有其他的存储设备,所以接下来的MPP 和 lib部署,我选择 nfs 远程挂载的方式。
mount -t nfs -o nolock -o tcp -o rsize=32768,wsize=32768 192.168.1.141:/work/rootfs_hi
/mnt
这是hi3519的。
cd /root
./nfsroot
echo "------nfsroot is over------"
cd /root/ko
./load3519v101 -a -sensor0 imx274 -osmem 64
echo "------ko is over---------"
cd /root
telnetd&
~onfig eth0 192.168.1.40
#mount -t nfs -o nolock -o tcp -o
rsize=32768,wsize=32768 192.168.1.59:/export/nfsroot /mnt
mount -t nfs -o nolock -o tcp -o rsize=32768,wsize=32768 192.168.1.141:/work/rootfs /mnt
telnetd&
~
setenv bootargs root=/dev/nfs rw nfsroot=192.168.1.141:/work/rootfs_hi/rootfs_glibc ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttyAMA0,115200 mem=128M
bootargs=mem=128M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=hi_sfc:1M(boot),4M(kernel),11M(rootfs)
bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000
osdrv/pub/bin/pc/mkfs.jffs2 -d
根文件系统路径
-l -e 0x10000 -o
xxx/xx/rootfs_uclibc_64k.jffs2
F.在 Ubuntu 下用 tar -zxf 解压: Hi3516CV500R001C02SPC001 /01.software/board/Hi3516CV500_SDK_V2.0.0.1.tgz
arm-himix200-linux.tgz 进入 Hi3516CV500_SDK_V2.0.0.1 目录 切换成 root 用户,执行解包脚本 $sudo su #source sdk.unpack 进入 osdrv 目录,按 readme_cn.txt 来 1)下载 linux-4.9.37.tar.gz 并拷贝到 osdrv/opensource/kernel 目录中 2)修改 Makefile 文件并执行 make all CHIP?=hi3516cv500 进入 arm-himix200-linux 目录 $chmod +x arm-himix200-linux.install #sudo ./arm-himix200-linux.install 注: 1)出错:/bin/sh: 1: pushd: not found $ sudo dpkg-reconfigure dash 选择No 2)出错:zlib.h 没有此文件或目录 $ sudo apt install zlib1g-dev 3)出错:“mkimage” command not found - U-Boot images will not be built 在 /etc/bash.bashrc 中添加 export PATH=/home/nsc/workspace/Hi3516CV500_SDK_V2.0.0.1/osdrv/opensource/uboot/u-boot-2016.11/tools:$PATH