hi3516 intro


原文链接: hi3516 intro

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 # getinfo nand
  no find nand                             //表明没有nand .

  hisilicon # getinfo spi                  //spi nor flash 16M
  Block:64KB Chip:16MB*1
  ID:0x20 0xBA 0x18
  Name:"N25QL128A"

  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

  4. ->将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 什么意思??   
-l, --little-endian     指定使用小端格式
-e, --eraseblock=SIZE   设定擦除块的大小为(默认: 64KiB = 0x10000) 这里的值需要和Flash器件保持一致,在uboot启动时log信息里面有

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

`