Hi3516CV500单板实操笔记

原文链接: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



发布了37 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Chen_qi_hai/article/details/104556541
今日推荐