天天看點

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

———————以上為廠家提供教程———————

二, 幾點說明:

使用某一工具鍊編譯後,如果需要更換工具鍊,請先将原工具鍊編譯檔案清除,然後再更換工具鍊編譯。

開始我發現使用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

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編譯出的鏡像檔案

└─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;

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

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

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

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

我的程式裡是缺少結構體 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 軟體

 下載下傳:

<a target="_blank" href="ftp://sources.redhat.com/pub/jffs2/mkfs.jffs2">ftp://sources.redhat.com/pub/jffs2/mkfs.jffs2</a>

或者使用指令:

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

在這裡,為了避免重新制作檔案系統,我采用了英蓓特公司的mbs-sam9g45開發闆自帶的jffs2檔案系統angstrom-x11-image-demo-glibc-at91.rootfs.jffs2。在整個制作jffs2檔案系統的過程中,我們采用root權限。

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

加載mtdblock産生虛拟塊裝置并把angstrom-x11-image-demo-glibc-at91.rootfs.jffs2的内容寫入生成的虛拟裝置中:

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

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。

繼續閱讀