閱讀972 返回首頁    go 人物


hi3531 SDK已編譯文件係統製作jffs2文件係統鏡像並解決問題 .

一, 安裝SDK

1、Hi3531 SDK包位置


    在"Hi3531_V100R001***/01.software/board"目錄下,您可以看到一個 Hi3531_SDK_Vx.x.x.x.tgz 的文件,


該文件就是Hi3531的軟件開發包。


2、解壓縮SDK包


    在linux服務器上(或者一台裝有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、在linux服務器上安裝交叉編譯器


    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一類的關鍵字。一個詞匯再未定義之前就使用就會出項這種錯誤,可以通過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 軟件

 下載:

https://yq.aliyun.com/articles/ftp://sources.redhat.com/pub/jffs2/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。

最後更新:2017-04-03 07:57:07

  上一篇:go 基於Linux係統的病毒
  下一篇:go os X下mds_stores占用大量cpu的解決辦法