天天看点

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。

继续阅读