Hi3520 SDK 在ubuntu下安装说明

Posted dxmcu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hi3520 SDK 在ubuntu下安装说明相关的知识,希望对你有一定的参考价值。

Hi3520 SDK 安装以及升级使用说明


1、先明确文中的几个概念。
   主片: 多片级联应用中,指PCI主片。
   从片: 多片级联应用中,指PCI从片。
   主arm:指双核中的arm11。
   从arm:指双核中的arm9。
2、第六章 FAQ,新增如何调整主从arm MMZ和os内存,实现16D1编码 or 16D1解码。
3、2009-12-15,精简内存,减少了从arm os内存,调整了16-bit mmz分配。

第一章 Hi3520 SDK V1.x.x.x 版本升级操作说明
   如果您是首次安装本SDK,请直接参看第2章。
    
第二章 首次安装SDK
1、Hi3520 SDK包位置
    在"Hi3520 DMS V100R001C01/software/board/"目录下,您可以看到一个 Hi3520_SDK_V1.x.x.x.tgz 的文件,
该文件就是Hi3520的软件开发包。

2、解压缩SDK包
    在linux服务器上(或者一台装有linux的PC上,主流的linux发行版本均可以),使用命令:tar -zxf Hi3520_SDK_V1.x.x.x.tgz ,
解压缩该文件,可以得到一个Hi3520_SDK_V1.x.x.x目录。

3、在linux服务器上安装交叉编译器
    1) 进入tools/toolchains,运行chmod +x cross.install,然后运行./cross.install即可,注意,需要有sudo权限或者root权限
    2) 执行source /etc/profile, 安装交叉编译器的脚本配置的环境变量就可以生效了,或者请重新登陆也可。

4、展开SDK包的其他内容(注意!这一步不可以省略)
    返回SDK目录,运行./sdk.unpack将会展开SDK包打包压缩存放的其他内容,请按照提示完成操作。这步操作可能需要几分钟。
如果您需要通过WINDOWS中转拷贝SDK包,请先运行./sdk.cleanup,收起SDK包的内容,拷贝到新的目录后再展开。

5、SDK目录介绍
Hi3520_SDK_VX.X.X.X 目录结构如下:
    |-- pub
    |   |-- images                  # 可供FLASH烧写的映像文件,如内核、jffs2文件系统
    |   |-- include                 # 公共头文件(该目录已废弃)
    |   |-- kbuild-FULL_REL         # 主ARM内核头文件,内核模块使用该目录来进行编译
    |   | `-- include               # 主ARM应用程序需要的头文件
    |   |-- kbuild-FULL_REL_SLAVE   # 从ARM内核头文件,内核模块使用该目录来进行编译
    |   | `-- include               # 从ARM应用程序需要的头文件
    |   |-- lib                     # 应用程序需要的库文件
    |   |-- resource                # 构成rootfs的各种组件,一般不需要关心
    |   |-- standee                 # 各模块的原始安装文件,如需要mmz.ko就可以在这里找到,同时也包含组件所需的调试信息
    |   `-- tarball                 # SDK各模块的打包备份文件
    |
    |-- extdrv                      # 板级外围驱动源码
    |-- rootfs-FULL_REL             # 主ARM的根文件系统
    |-- rootfs-SLV_FULL_REL         # 从ARM的根文件系统
    |-- scripts                     # 存放相关脚本的目录
    |-- sdk.cleanup                 # SDK清理脚本
    |-- sdk.unpack                  # SDK展开脚本
    |-- source                      # 放置所有源代码的目录
    |   |-- app                     # 应用程序类源代码
    |   |-- drv                     # 驱动类源代码
    |   |-- lib                     # Lib类源代码
    |   `-- os                      # OS相关源代码,如内核
    |-- tools                       # 工具类
    |    |-- bin                    # 可执行程序,如mkfs.cramfs
    |    `-- toolchains             # 交叉工具链,展开SDK时已自动安装
    |                               
    |-- mpp                         # 媒体处理平台发布的头文件、库以及内核模块,适用于单核
    |   |-- component               # 组件源代码
    |   |-- include                 # 对外头文件,包括FB,TDE
    |   |-- ko                      # 单ARM使用的内核模块,包括FB,TDE
    |   |-- lib                     # 单ARM使用的release版本库以及音频库
    |   `-- sample                  # sample代码,进入各个子目录,可以直接编译运行
    |                               
    |-- mpp_master                  # 媒体处理平台发布的头文件、库以及内核模块,适用于双核主ARM
    |   |-- component               # 组件源代码
    |   |-- include                 # 对外头文件,包括FB,TDE
    |   |-- ko                      # 主ARM使用的内核模块,包括FB,TDE
    |   |-- lib                     # 主ARM使用的release版本库以及音频库
    |   `-- sample                  # sample代码,进入各个子目录,可以直接编译运行
    |                               
    `-- mpp_slave                   # 媒体处理平台发布的头文件、库以及内核模块,适用于双核从ARM
        |-- component               # 组件源代码
        |-- include                 # 对外头文件,包括FB,TDE
        |-- ko                      # 从ARM使用的内核模块,包括FB,TDE
        |-- lib                     # 从ARM使用的release版本库以及音频库
        `-- sample                  # sample代码,进入各个子目录,可以直接编译运行

第三章、安装、升级Hi3520DEMO板开发开发环境
    # 如果您使用的Hi3520的DEMO板,可以按照以下步骤安装u-boot,内核以及文件系统,以下步骤均使用网络来更新。
    # 通常,您拿到的单板中已经有u-boot,如果没有的话,就需要使用仿真器进行烧写。
    # 具体操作步骤,请参见 DMS\\software\\Doc下的《Hi3520 Linux 开发环境用户指南》和 DMS\\application notes\\下的《Hi3520 U-boot移植应用 Application Notes》。
    # 以下操作假设您的单板已经有了u-boot。

1、配置tftp服务器
    # 可以使用任意的tftp服务器,将pub/images下的文件拷贝到tftp服务器的目录下。
    
2、更新u-boot的环境变量
    # 单板上电后,敲Ctrl-C,进入u-boot。先设置好serverip(即tftp服务器的ip)、ipaddr(单板ip)和ethaddr(单板的MAC地址)。
    setenv serverip xx.xx.xx.xx
    setenv ipaddr xx.xx.xx.xx
    setenv ethaddr xx:xx:xx:xx:xx:xx
    setenv netmask xx.xx.xx.xx
    setenv gatewayip xx.xx.xx.xx
    ping serverip,确保网络畅通。
    # 具体的使用方法请参见《Hi3520 Linux 开发环境用户指南》。
    
3、烧写并设置主u-boot
    (1)烧写
    protect off 0x80000000 +0x80000
    erase 0x80000000 +0x80000
    tftp 0x80000000 u-boot-hi3520v100_200M.bin;
    protect on 0x80000000 +0x80000
    
    (2)设置
    # 在u-boot下设置启动参数:(主ARM操作系统分配72MB的内存,并使用jffs2的文件系统,文件系统的大小为16MB)
    set bootargs mem=72M console=ttyAMA0,115200 root=1f01 rootfstype=jffs2 mtdparts=physmap-flash.0:14M(boot),16M(rootfs) pcimod=host pciclksel=1
    setenv bootcmd 'bootm 0x80100000'
    saveenv
    
4、烧写并设置从boot
    (1)烧写
    erase 0x80300000 +0x80000;
    tftp 0x80300000 u-boot-hi3520v100_slave_200M.img;  
    
    (2)设置
    set slave_bootargs mem=15M console=ttyAMA0,115200;
    saveenv
    
5、烧写主内核和文件系统
    erase 0x80100000 +0x200000;
    tftp 0x80100000 kernel-hi3520v100_full_release.img;
    erase 0x80E00000 +0x1000000;
    tftp 0x80E00000 rootfs-FULL_REL-Flash.jffs2;
    
6、烧写从内核和文件系统(到flash)及启动
    (1)烧写
    erase 0x80400000 +0x200000
    tftp 0x80400000 kernel-hi3520v100_full_release_slave.img
    erase 0x80600000 +0x800000
    tftp 0x80600000 rootfs-SLV_FULL_REL.cramfs.initrd.img    
    
    (2)手动启动从arm
    # 在主boot下输入:
    slavestart
   
    (3)设置从ARM自动启动
    # 在主boot下输入:
    set slave_kernel_addr 0x80400000
    set slave_initrd_addr 0x80600000
    set slave_autostart 1
    saveenv

7、启动新系统
    # 重启单板即可,第一次进入系统时,挂载文件系统的速度可能比较慢,请耐心等待。
    
8、使用新系统
    # 切记,不可随意在Linux下复位单板或断电,因为这样可能会损坏文件系统,导致文件丢失、损坏以致系统无法启动!
    # 每次重启单板请使用reboot;同理,单板断电时请先运行halt,待到挂死后再断电,这样可以有效地保护FLASH文件系统,也可以避免不必要的麻烦。

第四章、使用SDK和DEMO板进行开发
1、开启Linux下的网络
    # 执行命令加载网络驱动:
    modprobe h2gether;

    # 设置网络
    ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx;
    ifconfig eth0 xx.xx.xx.xx netmask xx.xx.xx.xx;
    route add default gw xx.xx.xx.xx
    # 然后ping一下其他机器,如无意外,网络将能正常工作。
    
    # 如果收包性能不足,目前确认通过增加协议栈缓存即可,可以按如下操作来调整收包缓存默认值和最大值
    echo "1048576" /proc/sys/net/core/rmem_default;
    echo "2048576" /proc/sys/net/core/rmem_max;
    
    # 在内存紧张的情况下,如果再进行繁重的网络访问,有可能会报出缺页异常。此时通过限制系统将内存用于文件系统cache的数值,
    # 可以提高网络突发情况下的处理能力。可以使用下面的命令将min_free_kbytes设置为2MB,提高网络突发情况下的可用内存数量
    echo 2000 > /proc/sys/vm/min_free_kbytes
    
2、使用NFS
    # 在开发阶段,推荐使用NFS作为开发环境。您开发的代码都可以放在NFS服务器上,通过NFS可以直接在DEMO板上访问到NFS服务器。
    # 执行命令加载NFS驱动:
    modprobe nfs
    # 然后挂载NFS文件系统:
    mount -t nfs -o nolock,rsize=1024 xx.xx.xx.xx:/your-nfs-path /mnt
    # 然后就可以在/mnt目录下看到你服务器上的文件了,当然,如果你挂载的NFS目录就是SDK下面的rootfs,那么你可以:
    chroot /mnt
    # 然后就可以在新的根目录下工作了。

3、开启telnet服务
    # 网络正常后,运行命令 telnetd& 就可以启动单板telnet服务,然后才能telnet到单板。

4、使用硬盘FAT32
    # 按以下顺序依次插入ko文件,由于部分模块已经编入内核了,以下可能有部分命令冗余:
    modprobe nls_base
    modprobe nls_cp437
    modprobe fat
    modprobe vfat
    modprobe msdos
    modprobe nls_iso8859-1
    modprobe nls_ascii
    modprobe scsi_mod
    modprobe sd_mod
    modprobe libata
    modprobe sata_sil
    # 注意: 调试时,如果对部分驱动有改动,重新生成了新模块,则无法通过modprobe方式插入,需使用insmod插入新模块。

    modprobe as-iosched                     # 增加IO调度算法,还有loop、cfq_iosched、deadline-iosched选择
    echo "anticipatory" > /sys/block/<devicename>/queue/scheduler   # 使能as-iosched算法,<devicename>是在/dev/<devicename>,如hda

    # 然后挂载FAT32文件系统:
    mount -t vfat /dev/sda1 /mnt
    
    # 然后就可以在/mnt目录下看到文件了
    # 其他驱动的使用请参考文档《驱动模块使用指南.txt》

    #! 当然,你也可以把以上操作都放到脚本里面,并让它在linux启动的时候自动执行。
    #! OK,到这里,所有的环境都已经准备好了,你可以开始媒体业务体验之旅了。

5、运行MPP业务
    # 进入mpp ko目录,加载KO
    cd mpp_master/ko
    ./load_master
    
    # (确保sample已编译)进入各sample目录下,执行即可。例:
    cd mpp_master/sample/vio
    ./sample_vio 1
    
第五章 地址空间分配与使用
1、RAM 内存管理
    # DEMO板上共有两块DDR内存:
    # DDRA 256M,对应物理地址从0xC0000000 到 0xCFFFFFFF;
    # DDRB 128M,对应物理地址从0xE0000000 到 0xE7FFFFFF。
    
    # 这些内存,一部分由操作系统管理,称之为os内存;另一部分则需根据业务进行灵活分配,称之为mmz内存。
    # 为此,SDK提供了一个内核模块mmz,来管理mmz内存。用户可以在插入mmz模块时,指定其管理的内存,例如:
    #   modprobe mmz mmz=anonymous,0,0xC2000000,32M:ddr16,0,0xE5800000,8M anony=1
    # 表示mmz管理两块内存。
    # 第一块内存名字为anonymous,起始地址为 0xC2000000,大小为32M。
    # 第二块内存名字为ddr16,起始地址为 0xE5800000,大小为8M。

2、DEMO板RAM内存分配
    # DEMO板的内存分配如下图所示:
    
    图1 DDRA内存分配 (主从mmz)
    -----|-------|  0xC0000000   # Reserved memory. You can use it all for your convience.
    1M   |rsv    |
    -----|-------|  0xC0100000   # Name:window. Usage: pci communication. If you have no pci, you can use for your convience.
    7M   |window |           
    -----|-------|  0xC0800000   # Name:anonymous. Usage: Frame Buffer.
    24M  |master |              
         |mmz    |
    -----|-------|  0xC2000000   # Name:anonymous. Usage: Video Buffer.
    224M |slave  |
         |mmz    |
    -----|-------|  0xD0000000   # End of 32-bit ddr.

    图2 DDRB内存分配(主ARM OS + 从ARM OS + 主从mmz)
    -----|-------|  0xE0000000   # slave file system. Note: image of slave file system must small than 5M.
    15M  |slave  |             
         |os     |
    -----|-------|  0xE0F00000   # Name:ddr16. Usage: arm11 alloc for vdec stream buffer, dcc msg buf, etc.
    15M  |master |
         |mmz    |
    -----|-------|  0xE1E00000   # Name:ipcm. Usage: communication memory between two arm.
    2M   |IPCM   |
         |memory |
    -----|-------|  0xE2000000   # master os memory.
    72M  |master |
         |os     |
    -----|-------|  0xE6800000   # Name:ddr16. Usage: arm9 alloc for venc stream buffer, channel context, etc.
    24M  |slave  |
         |mmz    |
    -----|-------|  0xE8000000   # End of 16-bit ddr
           
    # 主mmz加载在脚本 mpp_master/ko/load_master 中自动执行,无需用户操作。
    # 从mmz加载在脚本 mpp_slave/ko/run_slave 中自动执行,无需用户操作。

3、flash地址空间
    
    图3 flash空间分配
    -----|-------|  0x80000000
    1M   |master |
         |boot   |
    -----|-------|  0x80100000
    2M   |master |
         |kernel |
    -----|-------|  0x80300000
    1M   |slave  |
         |boot   |
    -----|-------|  0x80400000
    2M   |slave  |
         |kernel |
    -----|-------|  0x80600000
    8M   |slave  |
         |fs     |  
    -----|-------|  0x80E00000
    16M  |master |
         |fs     |
    -----|-------|
    
    # Flash 擦除需根据分区情况进行
    uboot:  erase 0x80000000 +0x80000      # 必须从0x80000000开始擦除,建议擦除大小0x80000, 这样原来保存的环境变量可不被擦除,避免重新设置。
    kernel: erase 0x80100000 +0x200000     # 必须擦除足够的空间,以写入kernel image文件
    rootfs: erase 0x80E00000 +0x1000000    # 必须从分区2起始地址开始擦除,必须擦除分区2全部内容。

    # flash的空间分配,要通过bootargs告诉主kernel
    set bootargs ......(此处省略):14M(boot),16M(rootfs)  
    14M(boot) 表示分区1,14M,存放 主boot(1M),主kernel(2M),从boot(1M),从kernel(2M) 和 从fs(8M)。
    16M(rootfs) 表示分区2,16M,存放 主fs(16M)。
    
    # 你可以根据实际从armfs、主armfs的大小,自行调整bootargs,并erase相应空间。以两个例子说明。
    从fs大小 主fs起始地址 主fs大小 erase从fs                     erase主fs                     bootargs               
    10M      0x81000000   16M      erase 0x80600000 +0xa000000   erase 0x81000000 +0x10000000  :16M(boot),16M(rootfs)
    12M      0x81200000   20M      erase 0x80600000 +0xc000000   erase 0x81200000 +0x10400000  :18M(boot),20M(rootfs)
        
第六章 FAQ
Q1: 如何制作从arm文件系统img文件?
A1:  # 如下执行:
    cd rootfs-SLV_FULL_REL;
    ./mknod_console;   # 必须执行该操作
    cp mkimg.rootfs ../;
    cd .. ;
    ./mkimg.rootfs rootfs-SLV_FULL_REL ./ rootfs-SLV_FULL_REL cramfs-initrd-img;
    rm mkimg.rootfs;
    生成的文件名为: rootfs-SLV_FULL_REL.cramfs.initrd.img

    mkimg脚本解释:
    ./mkimg.rootfs rootfs-SLV_FULL_REL ./ rootfs-SLV_FULL_REL  cramfs-initrd-img;
                       (1)             (2)         (3)               (4)
    (1)要制作的文件系统名  
    (2)img文件保存路径  
    (3)生成的img文件名
    (4)使用哪种文件系统

Q2: 什么时候,需要制作从arm文件系统img文件?
A2:  一般情况下,从arm是不需要您操作它的。
    只有当你希望在从arm运行自己的业务,或修改从arm MMZ时,才需要修改从arm文件系统,并重新制作img文件。
    
    1、将你的从arm业务程序放到从arm文件系统中。
    2、修改从arm自动启动脚本。使你的从arm业务程序能自动执行。
       rootfs-SLV_FULL_REL/etc/init.d/S20Cfgslave
    3、修改从armmmz配置脚本。注意,请仅修改 mmz 加载参数,其他不变。
       rootfs-SLV_FULL_REL/root/mpp_slave/ko/run_slave
    4、重新制作从arm文件系统img文件。
    5、将img文件烧写到flash中,请依照第三章介绍的烧写从arm文件系统的方法。
    
Q3: 更改从arm业务后,每次都烧写flash,太麻烦,有没有更好的办法?
A3: 当然有。
   烧写从kernel和filesystem(到内存)及启动  ----------- 快速调试从ARM的技巧
   (1) 烧写
   tftp 0xE0300000 kernel-hi3520v100_full_release_slave.img
   tftp 0xE0A00000 rootfs-SLV_FULL_REL.cramfs.initrd.img
   
   (2) 启动从arm
   # 在主boot下输入:
   slavestart 0xE0300000 0xE0A00000
   
   (3) 自动启动从arm
   #取消自动从FLASH中启动
   setenv slave_autostart
   # 在主boot中配置bootcmd,可每次重启单板时自动从TFTP服务器下载并启动从kernel和rootfs
   setenv bootcmd 'tftp 0xE0300000 kernel-hi3520v100_full_release_slave.img;tftp 0xE0A00000 rootfs-SLV_FULL_REL.cramfs.initrd.img;slavestart 0xE0300000 0xE0A00000;bootm 0x80100000'

Q4: 如何调整内存分配?
A4: 目前SDK提供了参考内存分配,详见第五章第2节中内存分配图。
    你可以调整它,但一定要小心。  
    *** 请谨记一个原则:内存分配不能重叠。***

   +-----+----------+-----------------------------------------------------------------------------------------+
   |序号 | 内存     | 修改示例及说明                                                                          |
   +-----+----------+-----------------------------------------------------------------------------------------+
   |(1)  |主arm os  | 修改前 set bootargs mem=56M ...               主arm os 管理 56M 内存                    |                                           |
   |     |          | 修改后 set bootargs mem=72M ...               主arm os 管理 72M 内存                    |                                           |        
   +-----+----------+-----------------------------------------------------------------------------------------+
   |(2)  |从arm os  | 修改前 set slave_bootargs mem=32M ...         从arm os 管理 32M 内存                    |
   |     |          | 修改后 set slave_bootargs mem=24M ...         从arm os 管理 24M 内存                    |
   +-----+----------+-----------------------------------------------------------------------------------------+
   |(3)  |主arm mmz | mpp_master/ko/load_master                     <-- 修改该文件                            |
   |     |          | modprobe mmz=anonymous,0,0xC2000000,32M       主arm mmz管理 32M 内存                    |
   +-----+----------+-----------------------------------------------------------------------------------------+
   |(4)  |从arm mmz | rootfs-SLV_FULL_REL/root/mpp_slave/run_slave  <-- 修改该文件,然后重新制作从片文件系统  |
   |     |          | modprobe mmz=anonymous,0,0xC4000000,192M      从arm mmz管理 192M 内存                   |
   +-----+----------+-----------------------------------------------------------------------------------------+

Q5: 如何运行 16D1 编解码业务
    请选择合适的配置,如下:
    1、编码码流Buffer设置为 宽*高
    2、解码码流Buffer设置为 宽*高
    3、调整公共VB配置,建议:
            Block size   Block count  note
        D1  704*576*3/2  16*5         无
        CIF 352*288*3/2  16*5         如果编码CIF小码流,则需配置。

Q6: 如何制作从arm u-boot image文件
A6: u-bootimage 制作 与 从arm 文件系统一样,只是入口地址不同,如下:
    mkimage -A arm -T ramdisk -C none -a 0xe1000000 -e 0xe1000000 -d u-boot-hi3520v100_slave_200M.bin u-boot-hi3520v100_slave_200M.img

第七章 单核使用
以上内容,讲的是如何在双核上运行mpp业务。本章重点介绍如何在单核上运行mpp业务。
1、mpp业务目录说明
   # 发布包根目录下,有三个mpp相关目录。
   mpp       :单核的工作目录。在单核上运行mpp业务时,使用此目录。
   mpp_master:双核的主arm工作目录。在双核上运行mpp业务时,使用此目录。
   mpp_slave :双核的从arm工作目录。目前不需关注。

2、在单核上运行mpp业务的过程
   # 此处将单双核操作过程放在一起,便于用户比较。
   +-----+---------------------+------------------------+---------------------------------+
   |序号 |      操作过程       |      单核              |       双核                      |
   +-----+---------------------+------------------------+---------------------------------+
   |(1)  | 烧写FLASH与单板启动 |                  单 双 核 一 致                          |
   +-----+---------------------+------------------------+---------------------------------+
   |(2)  | 加载ko              | 加载mpp/ko/下的ko      | 加载mpp_master/ko/下的ko        |
   +-----+---------------------+------------------------+---------------------------------+
   |(3)  | mpi 接口使用        |                  单 双 核 一 致                          |
   +-----+---------------------+------------------------+---------------------------------+
   |(4)  | 应用程序编译        | 使用mpp/lib/下的库文件 | 使用mpp_master/lib/下的库文件   |
   +-----+--------------------------------------------------------------------------------+
   
   # 从上表可以看出,单双核操作过程很相似。
   # 用户只需注意操作过程(2)、(4)的区别即可。特别提醒,(4)一定不能出错,否则会造成奇怪的问题。

以上是关于Hi3520 SDK 在ubuntu下安装说明的主要内容,如果未能解决你的问题,请参考以下文章

Hi3536DV100 SDK 安装以及升级使用说明

2ubuntu16.06安装Hi3518EV200 SDK

ubuntu14.04安装HI3518EV200的过程

hi3520的Hi3520 芯片主要特点

HI3520DV300核心板及配套底板介绍

Ubuntu上hi3531交叉编译环境arm-hisiv100nptl-linux搭建过程