zoukankan      html  css  js  c++  java
  • hi3531 SDK已编译文件系统制作jffs2文件系统镜像并解决这个问题 .

    一, 安装SDK

    1、Hi3531 SDK包位置


        在"Hi3531_V100R001***/01.software/board"文件夹下,您能够看到一个 Hi3531_SDK_Vx.x.x.x.tgz 的文件。


    该文件就是Hi3531的软件开发包。


    2、解压缩SDK包


        在linuxserver上(或者一台装有linux的PC上,主流的linux发行版本号均能够),使用命令:tar -zxf Hi3531_SDK_Vx.x.x.x.tgz ,


    解压缩该文件,能够得到一个Hi3531_SDK_Vx.x.x.x文件夹。


    3、展开SDK包内容


        返回Hi3531_SDK_Vx.x.x.x文件夹。执行./sdk.unpack(请用root或sudo权限执行)将会展开SDK包打包压缩存放的内容,请依照提示完毕操作。


    假设您须要通过WINDOWS操作系统中转拷贝SDK包,请先执行./sdk.cleanup,收起SDK包的内容,复制到新的文件夹后再展开。


    4、在linuxserver上安装交叉编译器


        1)安装uclibc交叉编译器(注意。须要有sudo权限或者root权限):


           进入Hi3531_SDK_Vx.x.x.x/osdrv/toolchain/arm-hisiv100-linux文件夹。执行chmod +x cross.install。然后执行./cross.install就可以。

          进入Hi3531_SDK_Vx.x.x.x/osdrv/toolchain/arm-hisiv100nptl-linux文件夹,执行chmod +x cross.install,然后执行./cross.install就可以。(原文档没有)


        2) 安装glibc交叉编译器(注意,须要有sudo权限或者root权限):


           进入Hi3531_SDK_Vx.x.x.x/osdrv/toolchain/arm-hisiv200-linux文件夹,执行chmod +x cross.install,然后执行./cross.install就可以。

       

        3) 运行source /etc/profile, 安装交叉编译器的脚本配置的环境变量就能够生效了。或者请又一次登陆也可。


    5、编译osdrv


        參见osdrv文件夹下readme


    ———————以上为厂家提供教程———————


    二, 几点说明:

    1、uclibc是面向嵌入式Linux系统的小型的C标准库,glibc是Linux的标准执行库。

    使用某一工具链编译后,假设须要更换工具链,请先将原工具链编译文件清除,然后再更换工具链编译。

    開始我发现使用arm-hisiv100-linux编译内核时。会提示找不到该命令,换到arm-hisiv200-linux能够。

    预计就是上述问题吧。

    2、source命令即运行命令,和“./”是一样的。(个人理解)

    3、Linux下也有环境变量,例如以下:

        常见的配置文件包含:

          (1-1)/etc/profile:对全部用户生效;此文件为系统的每一个用户设置环境信息,当用户第一次登录时,该文件被运行;并从/etc/profile.d文件夹的配置文件里搜集shell的设置。比如:编辑/etc/profile文件,加入CLASSPATH变量   

              # vi /etc/profile

              加入一行:export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib

              改动后须要运行又一次登录才干生效。也能够运行命令source /etc/profile来生效

         (1-2)/etc/bashrc:对全部用户生效。为每个执行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取编辑方法如上,不再赘述


         环境变量的查看

            (1)使用echo命令查看单个环境变量。

    比如:echo $PATH

            (2)使用env查看全部环境变量。比如:env

            (3)使用set查看全部本地定义的环境变量。比如:set

              另外,unset能够删除指定的环境变量。

              经常使用的环境变量

    

              PATH 决定了shell将到哪些文件夹中寻找命令或程序

              HOME 当前用户主文件夹

              HISTSIZE 历史记录数

              LOGNAME 当前用户的登录名

              HOSTNAME 指主机的名称

              SHELL 当前用户Shell类型

              LANGUGE  语言相关的环境变量。多语言能够改动此环境变量

              MAIL 当前用户的邮件存放文件夹

              PS1 基本提示符,对于root用户是#。对于普通用户是$

    





    三, osdrv 编译

    1.osdrv使用说明
    本文件夹设计思路为一套源码支持两种工具链编译,因此须要通过编译參数指定不同的工具链。

    当中arm-hisiv100nptl-linux是


    uclibc工具链,arm-hisiv200-linux是glibc工具链。详细命令例如以下
    (1)编译整个osdrv文件夹:
    make OSDRV_CROSS=arm-hisiv100nptl-linux all
    或者
    make OSDRV_CROSS=arm-hisiv200-linux all
    (2)清除整个osdrv文件夹的编译文件:
    make OSDRV_CROSS=arm-hisiv100nptl-linux clean
    或者
    make OSDRV_CROSS=arm-hisiv200-linux clean
    (3)彻底清除整个osdrv文件夹的编译文件。除清除编译文件外,还删除已编译好的镜像:
    make OSDRV_CROSS=arm-hisiv100nptl-linux distclean
    或者
    make OSDRV_CROSS=arm-hisiv200-linux distclean
    (4)单独编译kernel:
    待进入内核源码文件夹后,运行下面操作
    cp arch/arm/configs/godnet_defconfig .config
    make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- menuconfig
    make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- uImage
    或者
    cp arch/arm/configs/godnet_defconfig .config
    make ARCH=arm CROSS_COMPILE=arm-hisiv200-linux- menuconfig
    make ARCH=arm CROSS_COMPILE=arm-hisiv200-linux- uImage
    (5)单独编译uboot:
    待进入boot源码文件夹后,运行下面操作
    make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux- godnet_config
    make ARCH=arm CROSS_COMPILE=arm-hisiv100nptl-linux-
    或者
    make ARCH=arm CROSS_COMPILE=arm-hisiv200-linux- godnet_config
    make ARCH=arm CROSS_COMPILE=arm-hisiv200-linux-
    (6)制作文件系统镜像:
    在osdrv/pub/中有已经编译好的文件系统,因此无需再反复编译文件系统。仅仅须要依据单板上flash的规格型号制作文件系统镜像即


    可。


    spi flash使用jffs2格式的镜像。制作jffs2镜像时,须要用到spi flash的块大小。这些信息会在uboot启动时会打印出来


    。建议使用时先直接执行mkfs.jffs2工具,依据信息打印填写相关參数。以下以块大小为64KB为例:
    osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc -l -e 0x40000 -o osdrv/pub/rootfs_uclibc_256k.jffs2


    osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc -l -e 0x10000 -o osdrv/pub/rootfs_uclibc_64k.jffs2
    sudo osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc -l -e 0x10000 --pad=0x9A0000 -o osdrv/pub/rootfs_uclibc_64k.jffs2
    sudo osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc_slq -l -e 0x10000 --pad=0x9A0000 -o osdrv/pub/rootfs_uclibc_64k_slq.jffs2


    sudo osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc_slq -l -e 0x10000 --pad=0x9A0000 -o  /slq/tftpboot/rootfs_slq9856k_slq3.17

    25216k

    sudo osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc_slq -l -e 0x10000 --pad=0x18A0000 -o osdrv/pub/rootfs_25216kslq.jffs2


    sudo osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc_slq -l -e 0x10000 --pad=0x18A0000 -o  /slq/tftpboot/rootfs_slq25216k_slq3.17


    或者
    osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_glibc -l -e 0x40000 -o osdrv/pub/rootfs_glibc_256k.jffs2


    nand flash使用yaffs2格式的镜像,制作yaffs2镜像时。须要用到nand flash的pagesize和ecc。这些信息会在uboot启动


    时会打印出来。建议使用时先直接执行mkyaffs2image工具,依据信息打印填写相关參数。以下以2KB pagesize、1bit ecc为例:
    osdrv/pub/bin/pc/mkyaffs2image osdrv/pub/rootfs_uclibc osdrv/pub/rootfs_uclibc_2k_1bit.yaffs2 1 1
    或者
    osdrv/pub/bin/pc/mkyaffs2image osdrv/pub/rootfs_glibc osdrv/pub/rootfs_glibc_2k_1bit.yaffs2 1 1

    2. 镜像存放文件夹说明
    编译完的image。rootfs等存放在osdrv/pub文件夹下
    pub
    │  rootfs_uclibc.tgz ------------------------------------------ hisiv100nptl编译出的rootfs文件系统
    │  rootfs_glibc.tgz ------------------------------------------- hisiv200编译出的rootfs文件系统

    ├─image_glibc ------------------------------------------------ hisiv200编译出的镜像文件
    │      uImage ------------------------------------------------- kernel镜像
    │      u-boot-hi3531_930MHz.bin ------------------------------- u-boot镜像
    │      rootfs_256k.jffs2 -------------------------------------- jffs2 rootfs镜像(相应spi-flash blocksize=256K)
    │      rootfs_2k_1bit.yaffs2 ---------------------------------- yaffs2 rootfs镜像(相应nand-flash pagesize=2K 


    ecc=1bit)

    ├─image_uclibc ----------------------------------------------- hisiv100nptl编译出的镜像文件
    │      uImage ------------------------------------------------- kernel镜像
    │      u-boot-hi3531_930MHz.bin ------------------------------- u-boot镜像
    │      rootfs_256k.jffs2 -------------------------------------- jffs2 rootfs镜像(相应spi-flash blocksize=256K)
    │      rootfs_2k_1bit.yaffs2 ---------------------------------- yaffs2 rootfs镜像(相应nand-flash pagesize=2K 


    ecc=1bit)

    └─bin
        ├─pc
        │      mkfs.jffs2
        │      mkimage
        │      mkfs.cramfs
        │      mkyaffs2image
        │
        ├─board_glibc -------------------------------------------- hisiv200编译出的单板用工具以及pcie消息通讯层ko
        │      flash_eraseall
        │      mcc_usrdev_host.ko
        │      flash_erase
        │      mcc_usrdev_slv.ko
        │      hi35xx_dev_slv.ko
        │      nandwrite
        │      hi35xx_dev_host.ko
        │      mcc_drv_slv.ko
        │      mtd_debug
        │      flash_info
        │      mcc_drv_host.ko
        │      boot_device.ko
        │      pcit_dma_slv.ko
        │      sumtool
        │      mtdinfo
        │      flashcp
        │      nandtest
        │      nanddump
        │      parted_glibc
        │      pcit_dma_host.ko
        │      gdb-arm-hisiv200-linux
        │
        └─board_uclibc ------------------------------------------- hisiv100nptl编译出的单板用工具以及pcie消息通讯层ko
                flash_eraseall
                mcc_usrdev_host.ko
                flash_erase
                mcc_usrdev_slv.ko
                hi35xx_dev_slv.ko
                nandwrite
                hi35xx_dev_host.ko
                mcc_drv_slv.ko
                mtd_debug
                flash_info
                parted_uclibc
                mcc_drv_host.ko
                boot_device.ko
                pcit_dma_slv.ko
                sumtool
                mtdinfo
                flashcp
                nandtest
                gdb-arm-hisiv100nptl-linux
                nanddump
                pcit_dma_host.ko




    3.osdrv文件夹结构说明:
    osdrv
    ├─Makefile ------------------------------ osdrv文件夹编译脚本
    ├─busybox ------------------------------- 存放busybox源码的文件夹
    ├─tools --------------------------------- 存放各种工具的文件夹
    │  ├─board_tools ----------------------- 各种单板上使用工具
    │  │  ├─reg-tools-1.0.0 --------------- 寄存器读写工具
    │  │  ├─mtd-utils --------------------- flash裸读写工具
    │  │  ├─udev-100 ---------------------- udev工具集
    │  │  ├─gdb --------------------------- gdb工具
    │  │  ├─parted ------------------------ 大容量硬盘分区工具
    │  │  └─e2fsprogs --------------------- mkfs工具集
    │  └─pc_tools -------------------------- 各种pc上使用工具
    │      ├─mkfs.cramfs ------------------- cramfs文件系统制作工具
    │      ├─mkfs.jffs2 -------------------- jffs2文件系统制作工具
    │      ├─mkimage ----------------------- uImage制作工具
    │      ├─mkyaffs2image301 -------------- yaffs2文件系统制作工具
    │      ├─nand_production --------------- nand flash烧写文件制作工具
    │      └─uboot_tools ------------------- uboot镜像制作工具、xls文件及ddr初始化脚本、bootrom工具
    ├─toolchain ----------------------------- 存放工具链的文件夹
    │  ├─arm-hisiv100nptl-linux ---------------- hisiv100nptl交叉工具链
    │  └─arm-hisiv200-linux ---------------- hisiv200交叉工具链
    ├─pub ----------------------------------- 存放各种镜像的文件夹
    │  ├─image_glibc ----------------------- 基于hisiv100nptl工具链编译,可供FLASH烧写的映像文件。包含uboot、内核、


    文件系统
    │  ├─image_uclibc ---------------------- 基于hisiv200工具链编译。可供FLASH烧写的映像文件。包含uboot、内核、文件


    系统
    │  ├─bin ------------------------------- 各种未放入根文件系统的工具
    │  │  ├─pc ---------------------------- 在pc上运行的工具
    │  │  ├─board_glibc ------------------- 基于hisiv100nptl工具链编译,在单板上运行的工具
    │  │  └─board_uclibc ------------------ 基于hisiv200工具链编译,在单板上运行的工具
    │  ├─rootfs_uclibc.tgz ----------------- 基于hisiv100nptl工具链编译的根文件系统
    │  └─rootfs_glibc.tgz ------------------ 基于hisiv200工具链编译的根文件系统
    ├─drv ----------------------------------- 存放外设驱动的文件夹
    │  └─pcie_mcc -------------------------- pcie消息通讯层驱动
    ├─rootfs_scripts ------------------------ 存放根文件系统制作脚本的文件夹
    ├─uboot --------------------------------- 存放uboot源码的文件夹
    └─kernel -------------------------------- 存放kernel源码的文件夹




    4.注意事项
    (1)使用某一工具链编译后,假设须要更换工具链,请先将原工具链编译文件清除。然后再更换工具链编译。
    (2)在windows下复制源代码包时。linux下的可运行文件可能变为非可运行文件,导致无法编译使用;u-boot或内核下编译后,会有非常


    多符号链接文件。在windows下复制这些源代码包, 会使源代码包变的巨大,由于linux下的符号链接文件变为windows下实实在在的文件


    ,因此源代码包膨胀。因此使用时请注意不要在windows下复制源代码包。
    (3)眼下网络为自适应模式。假设要改动为固定某种速率模式,须要改动文件kernel/linux-


    3.0.y/drivers/net/stmmac/stmmac_mdio.c:
    关掉宏定义TNK_HW_PLATFORM_ADJUST,凝视掉33行;
    选择须要固定配置的速率,比如固定配置为百兆全双工的话。打开46行宏定义PHY_SPEED_100就可以。


    (4)Hi3531支持硬浮点,文件系统中公布的库都是硬浮点库。因此请用户注意,全部Hi3531板端代码编译时须要在Makefile里面加入


    下面命令:
    CFLAGS += -march=armv7-a -mcpu=cortex-a9 –mfloat-abi=softfp -mfpu=vfpv3-d16
    CXXFlAGS +=-march=armv7-a -mcpu=cortex-a9 –mfloat-abi=softfp -mfpu=vfpv3-d16
    当中CXXFlAGS中的XX依据用户Makefile中所使用宏的详细名称来确定,e.g:CPPFLAGS。



    将生成的文件系统刷到目标板上,发现网卡驱动载入不上,把 /hitoe/stmmac.ko 用之前能用的文件系统里的替换掉,又一次生成的文件系统载入后就能够用了.


    四, 设置网卡,挂载NFS文件夹

     ifconfig eth0 hw ether 00:00:23:34:45:66;

    ifconfig eth0 192.168.0.133 netmask 255.255.255.0;

    route add default gw 192.168.0.1;ifconfig;

    ping 192.168.0.233


    挂载NFS文件夹

    mount -t nfs -o nolock 192.168.0.233:/home/ls/nfs  /mnt/slq                                           

    mount -t nfs -o nolock 192.168.1.210:/home/ks/hi3531/nfs_3531  /mnt

     

    tftp 192.168.1.210 -l test –g

    tftp 192.168.1.210 -l a1.264 –p



    五, 制作并载入第2个文件系统

    1. 创建一个空目录

    root@ubuntu:/slq/local/Hi3531_SDK_V1.0.B.0/osdrv/pub# mkdir rootfs_custom_slq

    2. 用这个空目录做一个1M大小的jffs2文件系统镜像

    ls@ubuntu:/slq/local/Hi3531_SDK_V1.0.B.0$ sudo osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_custom_slq -l -e 0x10000 --pad=0x100000 -o osdrv/pub/rootfs_custom_64k_slq.jffs2

    3. 将镜像刷到板子上

    //custom
    mw.b 0x82000000 0xff 0x100000; tftp 0x82000000 fs_custom_64k_slq; sf probe 0; sf erase 0xf00000 0x100000; 
    sf write 0x82000000 0xf00000 $(filesize); save;reset


    4. 这里不知道怎么回事,  用tftp下载时原文件名称为 fs_custom_64k_slq.jffs2 时就会找不到这个文件,将 .jffs2去掉就能够了.也可能是把生成的文件系统镜像放到 /slq/tftpboot 文件夹后要对文件重命名,加入权限的原因 .


    5. 重新启动后进入文件系统,查看flash分区  

    # cat /proc/mtd
    dev:    size   erasesize  name
    mtd0: 00060000 00010000 "uboot"
    mtd1: 00020000 00010000 "uboot_logo"
    mtd2: 00040000 00010000 "config"
    mtd3: 004a0000 00010000 "kernel"
    mtd4: 009a0000 00010000 "rootfs"
    mtd5: 00100000 00010000 "custom"


    6. 创建一个文件夹 /slq, 并将 custom 分区挂载到 /slq 文件夹下,

    # mkdir /slq

    # mount -t jffs2 /dev/mtdblock5 /slq

    # df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/root                 9856      4336      5520  44% /
    tmpfs                    61596         4     61592   0% /dev
    /dev/mtdblock5            1024       196       828  19% /slq


    7. 改动开机自己主动挂载和网卡配置

    在 /etc/profile 中加入几行:

    #slq

    mount -t jffs2 /dev/mtdblock5 /slq

    ifconfig eth0 hw ether 00:00:23:34:45:66;

    ifconfig eth0 192.168.0.133 netmask 255.255.255.0;

    route add default gw 192.168.0.1;


    之后 能够在板子上挂载NFS

    mount -t nfs -o nolock 192.168.0.233:/home/ls/nfs /mnt/ls


    网卡配置最好在

    /etc/init.d/S80network 中单独配置


    六, 问题解决等

    1.备份文件系统

    mw.b 0x81000000 0xff 0x9a0000; sf probe 0; sf read 0x81000000 0x560000 0x9a0000;tftp 0x81000000 sdkfs9856k 0x9a0000

    文件系统大小, 9856k=0x9a0000 , 从 5504k=0x560000 处開始 ,  保存到tftp 文件夹,文件名称为 sdkfs9856k


    2.  文件系统做好之后网卡不能配置

    开机日志中[RCS]: /etc/init.d/S81toe 执行出错,原因是网卡驱动 /hitoe/stmmac.ko不能载入

    用备份中已经可用的网卡驱动将其替换,执行成功


    可能是由于网卡驱动默认使用第一个网口,可是我用的板子使用的是第二个网口

    eth0: PHY ID 001cc915 at 0 IRQ 0 (1:00)
    eth0: PHY ID 001cc915 at 2 IRQ -6 (1:02) active

    这里应该是第二个网口可用 ,以下是相关开机日志


     VFS: Mounted root (jffs2 filesystem) on device 31:4.
    Freeing init memory: 184K


                _ _ _ _ _ _ _ _ _ _ _ _
                 _  _   _  _ _ ___
                / /__/ |_/
               / __   /  -  _ ___
              / /  / /  / /
      _ _ _ _/ /  /  \_/  \_ ______
    ___________\___\__________________


    [RCS]: /etc/init.d/S00devs
    [RCS]: /etc/init.d/S01udev
    Jan  1 00:00:03 udevd (591): /proc/591/oom_adj is deprecated, please use /proc/591/oom_score_adj instead.
    udevd[591]: main: error opening /dev/null: No such file or directory
    [RCS]: /etc/init.d/S80network
    [RCS]: /etc/init.d/S81toe
    STMMAC driver:
    platform registration... 
    done!
    Set system config register 0x200300ec with value 0x003f003f
    done!
    DWMAC1000 - user ID: 0x10, Synopsys ID: 0x36
    Enhanced descriptor structure
    MACADDR in get is 0:0:0:0:0:0
    no valid MAC address for MAC 0;please, use ifconfig or nwhwconfig!
    eth0 - (dev. name: stmmaceth - id: 0, IRQ #119
    IO base addr: 0xc89c0000)
    STMMAC MII Bus: probed
    eth0: PHY ID 001cc915 at 0 IRQ 0 (1:00)
    eth0: PHY ID 001cc915 at 2 IRQ -6 (1:02) active

    DWMAC1000 - user ID: 0x10, Synopsys ID: 0x36
    Enhanced descriptor structure
    MACADDR in get is 0:0:0:0:0:0
    no valid MAC address for MAC 1;please, use ifconfig or nwhwconfig!
    eth1 - (dev. name: stmmaceth - id: 0, IRQ #119
    IO base addr: 0xc89c4000)
    eth1: PHY ID 001cc915 at 0 IRQ 0 (1:00)
    eth1: PHY ID 001cc915 at 2 IRQ -6 (1:02)
    stmmac_reset: RESET COMPLETE!


    **************************************************
    *  TNK driver built on Mar 17 2013 at 14:17:12
    *  TNK driver mode is BYPASS
    **************************************************
    stmmac: Rx Checksum Offload Engine supported
    stmmac: Rx Checksum Offload Engine supported
    Auto login as root ...
    Jan  1 00:00:03 login[631]: root login on 'ttyS000'
    Welcome to HiLinux.
    MACADDR in set is 0:0:23:34:45:66
    PHY: 1:02 - Link is Up - 100/Full


    3. 执行一下mpp/sample/hifb里的sample_hifb測试程序,出现错误

    # pwd
    /mnt/mpp/sample/hifb_bak

    # ./sample
    ./sample: can't load library 'libz.so.1'

    原因是系统变量的库文件夹中没有这个库,在文件系统中查找这个库

    # find / -name libz.so.1
    /mnt/mpp/sample/hifb/lib/libz.so.1
    /mnt/mpp/sample/hifb_bak/lib/libz.so.1
    /mnt/mpp/sample/hifb_for/lib/libz.so.1
    /mnt/qt/lib/libz.so.1
    /mnt/lib/libz.so.1


    缺少库文件,在配置文件 /etc/profile 中库路径中加入  :/mnt/mpp/sample/hifb/lib 

    LD_LIBRARY_PATH="/mnt/ls/qt/lib:/usr/local/lib:/usr/lib:/mnt/mpp/sample/hifb_bak"


    :/mnt/mpp/sample/hifb_bak  为加入部分

    执行 source /etc/profile 执行配置脚本使其生效


    4.   这时候执行一下mpp/sample/hifb里的sample_hifb測试程序,仍出现错误


    hifb.ko 驱动无法载入

    解决方法

    将sdk 中的(不是备份中的,其它版本号也可能不兼容) mpp/ko文件夹下驱动放到 板子的 /home/decoder/ko_hi3531 文件夹下,并将 文件夹下中的 load3531 脚本用 备份中已经改动过的版本号取代,然后在配置脚本 /etc/profille 中加入例如以下行

    进入驱动文件夹, 运行 load3531 脚本加入相关驱动,返回到原来的文件夹中

    cd /home/decoder/ko_hi3531;         
    ./load3531                     
    cd - 

    5【错误总结】expected specifier-qualifier-list before sth

             在使用GCC时常常会遇到expected specifier-qualifier-list before sth之类的错误。specifiers是指void、char、struct Foo等词汇。qualifiers是指像const和volatile一类的keyword

    一个词汇再未定义之前就使用就会出项这样的错误,能够通过typedef进行定义以后再使用。

    我的程序里是缺少结构体 HIFB_LAYER_ID_E 的定义,加入上问题就攻克了。

    typedef enum 
    {
        HIFB_LAYER_0 = 0x0,
        HIFB_LAYER_1,
        HIFB_LAYER_2,
        HIFB_LAYER_3,    
        HIFB_LAYER_4,
        HIFB_LAYER_CURSOR_0,
        HIFB_LAYER_CURSOR_1,
        //HIFB_LAYER_CURSOR,
        HIFB_LAYER_ID_BUTT
    } HIFB_LAYER_ID_E;


    以下是网上的资料


    hi3531自带的SDK已经有了,自己装的反而可能不兼容

    安装 mkfs.jffs2 软件

     下载:

    或者使用命令:
    apt-get install mtd-utils


    2.   挂载、制作jffs2文件系统

    在这里,为了避免又一次制作文件系统,我採用了备份的jffs2文件系统hi3531_rootfs_9856k.jffs2

    在整个制作jffs2文件系统的过程中,我们採用root权限。

    2.1.   挂载文件系统镜像

    jffs2文件系统不是块设备,不能直接mount,须要做一些中间步骤。首先,内核必须支持MTD,而且编译了mtdram、mtdblock这两个模块。先先建立一个大于等于要挂载的文件系统的虚拟mtd设备。

    hi3531_rootfs_9856k.jffs2文件系统为9856k,那么我先建立一个大于等于9856k的虚拟mtd设备。(为了避免制作过程其中向文件系统里边加入大文件。我将mtd大小设置为9856K)

    $ sudo modprobe mtdram total_size=9856

    当中。total_size的单位是KB。指定mtd的大小。

    载入mtdblock产生虚拟块设备并把hi3531_rootfs_9856k.jffs2的内容写入生成的虚拟设备中:

    $ sudo modprobe mtdblock

    $ sudo dd if=/slq/tftpboot/hi3531_rootfs_9856k.jffs2 of=/dev/mtdblock0

    (注:dd命令是指定大小的块复制文件,并在拷贝的同一时候进行指定的转换。if=file:输入文件名称,缺省为标准输入。of=file:输出文件名称。缺省为标准输出。

    创建挂载点:

    $mkdir /mnt/mtd

    如今就能够mount了:

    $ sudo mount -t jffs2 /dev/mtdblock0 /mnt/mtd

    进入/mnt/mtd之后就可以对文件系统进行改动!



    sudo mount -t hi3531_rootfs_9856k /dev/mtdblock0 /mnt/mtd


    sudo mkfs.jffs2 -r jffs2test1 -o fstest_slq14.3.04.jffs2 -e 0x20000 --pad=0x9A0000 -s 0x800 –n -l

    sudo mkfs.jffs2 -r mtd -o fstest_slq14.3.04.jffs2 -e 0x10000 --pad=0x9A0000 -s 0x800 –n -l


    sudo mkfs.jffs2 -r mtd -o fstest_slq14.3.04.jffs2 -e 0x10000 --pad=0x9A0000 -s 0x800 -l

    sudo mkfs.jffs2 -r mtd -o fsbusybox_slq14.3.05.jffs2 -e 0x10000 --pad=0x9A0000 -s 0x800 -l


    sudo mkfs.jffs2 -r fscontentbak.jffs2 -o fsbusybox64k2k_slq14.3.05.jffs2 -e 0x10000 --pad=0x9A0000 -s 0x800 -l


    说明:
    页大小0x1000   4k
    块大小0x40000  256k

    64k=0x10000 的块大小 block size

    2k =0x800      的页大小 page size


    2.   挂载、制作jffs2文件系统

    在这里,为了避免又一次制作文件系统,我採用了英蓓特公司的MBS-SAM9G45开发板自带的jffs2文件系统Angstrom-x11-image-demo-glibc-at91.rootfs.jffs2。在整个制作jffs2文件系统的过程中,我们採用root权限。

    2.1.   挂载文件系统镜像

    jffs2文件系统不是块设备,不能直接mount,须要做一些中间步骤。首先,内核必须支持MTD,而且编译了mtdram、mtdblock这两个模块。先先建立一个大于等于要挂载的文件系统的虚拟mtd设备。

    Angstrom-x11-image-demo-glibc-at91.rootfs.jffs2文件系统为28.2M。那么我先建立一个大于等于28.2M的虚拟mtd设备。

    (为了避免制作过程其中向文件系统里边加入大文件,我将mtd大小设置为50M*1024=50720K)

    $ sudo modprobe mtdram total_size=50720

    当中,total_size的单位是KB,指定mtd的大小。

    载入mtdblock产生虚拟块设备并把Angstrom-x11-image-demo-glibc-at91.rootfs.jffs2的内容写入生成的虚拟设备中:

    $ sudo modprobe mtdblock

    $ sudo dd if=/home/Embest_SAM9G45/Angstrom-x11-image-demo-glibc-at91.rootfs.jffs2 of=/dev/mtdblock0

    (注:dd命令是指定大小的块复制文件,并在拷贝的同一时候进行指定的转换。if=file:输入文件名称,缺省为标准输入。of=file:输出文件名称,缺省为标准输出。

    创建挂载点:

    $mkdir /mnt/mtd

    如今就能够mount了:

    $ sudo mount -t jffs2 /dev/mtdblock0 /mnt/mtd

    进入/mnt/mtd之后就可以对文件系统进行改动!


    2.2.  制作jffs2文件系统镜像

    改动(在后边一步讲)好自己的文件系统后,退到已做好的文件系统文件夹的上一级。比方我的文件系统的挂载点是/mnt/mtd,则退到/mnt文件夹下。用mkfs.jffs2工具制作jffs2文件系统,例如以下:

    #mkfs.jffs2 -r rootfs -o fs.jffs2 -e 0x20000 --pad=0x500000 -s 0x800 –n -l

    就可以生成 rootfs.jffs2

    Mkfs.jffs2各參数的意义例如以下:

    -r:指定要做成image的文件夹名。

    -o:指定输出image的文件名称。

    -e:每一块要擦除的block size,默认是64KB.要注意,不同的flash, 其block size会不一样,三星的K9F2G08U0A的block size为0x20000(从其datasheet里能够找到)。

    在没有加-e选项是,启动会出现下面错误:at91sam user.warn kernel: Empty flash at 0x00f0fffc ends at 0x00f10000。因此。若有类似的错误,加上-e选项,并配置nandflash的块大小,就可以消除。

    --pad(-p):用16进制来表示所要输出文件的大小,也就是fs.jffs2的大小,假设实际大小不足此设定的大小。则用0xFF补足。也能够不用此选项,生成的文件系统的大小跟本身大小一致,临时还不知道有和妙用,可是加上后会少出现非常多错误。

    -n。-no-cleanmarkers:指明不加入清楚标记(nandflash有自己的校检块,存放相关的信息)。假设挂载后会出现类似:CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0的警告,则加上-n就会消失。

    -l,--little-endian:指定使用小端格式。

    -s,  指明页的大小,默认是4k=0x1000,我们使用的nandflash的页的大小为2048字节=2k=0x800。

    还有的选项,不须要了。能够自己看帮助!用例如以下命令mkfs.jffs2 –h。

  • 相关阅读:
    linux下安装apache2.4
    tomcat中设置多项目共享jar;类包
    解决在mybatis中使用CTE进行oracle查询数据类型为long的字段出现流关闭问题
    oracle根据pid查询出正在执行的执行语句
    通过配置tomcat虚拟路径配置站点的静态资源
    百度编辑器umeditor使用总结
    通过ApplicationContextAwareSpring实现手工加载配置的javabean
    jquery登录验证插件
    linux服务器下tomcat部署项目内存溢出
    读取properties文件
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6822004.html
Copyright © 2011-2022 走看看