hi3516 tool mkjffs2


原文链接: hi3516 tool mkjffs2

apt-get install mtd-utils
命令使用实例:
mkfs.jffs2 -s 0x1000 -e 0x40000 -p 0x500000 -d rootfs/ -o jffs2_264k.img
说明:
-s 0x1000 页大小0x1000 4k
-e 0x40000 块大小0x40000 256k
-p 0x500000 jffs2分区总空间0x500000即5M
当然生成的jffs2.img并没有一下子分配5M,还是实际大小0xc0000

//制作烧录文件系统
osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc_3516dv300 -l -e 0x10000 -o osdrv/pub/rootfs_hi3516dv300_64k.jffs2 --pad=0x300000
-l, --little-endian 指定使用小端格式
-e, --eraseblock=SIZE 设定擦除块的大小为(默认: 64KiB = 0x10000)

mkfs.jffs2使用方法
选项含义(man a mkfs.jffs2)

mkfs.jffs2: Usage: mkfs.jffs2 [OPTIONS]
Make a JFFS2 file system image from an existing directory tree
Options:
-p, --pad[=SIZE] 用16進制來表示所要輸出檔案的大小,也就是root.jffs2的size。

                                   很重要的是, 為了不浪費flash空間, 這個值最好符合flash driver所規劃的區塊大小。
                                   如果不足则使用0xff来填充补满。

-r, -d, --root=DIR 指定要做成image的源資料夾.(默认:当前文件夹)
-s, --pagesize=SIZE 节点页大小(默认: 4KiB)
-e, --eraseblock=SIZE 设定擦除块的大小为(默认: 64KiB)
-c, --cleanmarker=SIZE Size of cleanmarker (default 12)
-m, --compr-mode=MODE Select compression mode (default: priortiry)
-x, --disable-compressor=COMPRESSOR_NAME

                      Disable a compressor

-X, --enable-compressor=COMPRESSOR_NAME

                      Enable a compressor

-y, --compressor-priority=PRIORITY:COMPRESSOR_NAME

                      Set the priority of a compressor

-L, --list-compressors Show the list of the avaiable compressors
-t, --test-compression Call decompress and compare with the original (for test)
-n, --no-cleanmarkers 指明不添加清楚标记(nand flash 有自己的校检块,存放相关的信息。)

                      如果挂载后会出现类似:
                      CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0
                      的警告,则加上-n 就会消失。

-o, --output=FILE 指定輸出image檔案的文件名.(default: stdout)
-l, --little-endian 指定使用小端格式
-b, --big-endian 指定使用大端格式
-D, --devtable=FILE Use the named FILE as a device table file
-f, --faketime Change all file times to '0' for regression testing
-q, --squash Squash permissions and owners making all files be owned by root
-U, --squash-uids 将所有文件的拥有者设为root用户
-P, --squash-perms Squash permissions on all files

  --with-xattr        stuff all xattr entries into image
  --with-selinux      stuff only SELinux Labels into jffs2 image
  --with-posix-acl    stuff only POSIX ACL entries into jffs2 image

-h, --help 显示这些文字
-v, --verbose Verbose operation
-V, --version 显示版本
-i, --incremental=FILE Parse FILE and generate appendage output for it

生成的rootfs.img可通过u-boot直接烧写至nand flash:

          nand erase 0x200000 0x3e00000//擦写
          tftp 0x30000000 rootfs.img//下载
          nand write.jffs2 0x200000 $(filesize)//烧入

(二) 在linux的PC上挂载jffs2根文件系统映像

因为jffs2是构建于MTD设备上的文件系统,所以无法通过loop设备来挂载,但是可以通过mtdram设备来挂载。mtdram是在用RAM实现的MTD设备,可以通过mtdblock设备来访问。使用mtdram设备很简单,只要加载mtdram和mtdblock两个内核模块即可。这两个内核模块一般的linux内核发行版都有编译好的,直接用modprobe命令加载。
下面是具体步骤:

(1).加载mtdblock内核模块
modprobe mtdblock
(2).加载mtdram内核模块,将该设备的大小指定为jffs2根文件系统映像的大小,块擦除大小(即flash的块大小)指定为制作该jffs2根文件系统时“-e”参数指定的大小,缺省为64KB。下面两个参数的单位都是KB。
modprobe mtdram total_size=5120 erase_size=256

(3).这时将出现MTD设备/dev/mtdblock0,使用dd命令将jffs2根文件系统拷贝到/dev/mtdblock0设备中。

dd if=jffs2.img of=/dev/mtdblock0
(4).将保存了jffs2根文件系统的MTD设备挂载到指定的目录上。
mount -t jffs2 /dev/mtdblock0 /mnt/mtd

这之后就可以到/mnt/mtd目录查看、修改挂载的jffs2根文件系统了,修改后的jffs2根文件系统可以通过dd命令拷贝为一个jffs2的映像文件

1.修改uboot中的分区参数:

修改为rootfs格式为jffs2的,且适当扩大rootfs分区大小。(因jffs2的压缩比不如只读的squashfs)

#define CONFIG_BOOTARGS BOOTARGS_COMMON " init=/linuxrc rootfstype=jffs2 root=/dev/mtdblock2 rw mtdparts=jz_sfc:256k(boot),2560k(kernel),3072k(root),-(apps)"

2.生成jffs2格式的rootfs

mkfs.jffs2 -o rootfs.jffs2 -r rootfs -e 0x8000 -n -l -X zlib --pad=0x300000

这里需要注意两个参数:

-e:擦除块的大小,这个参数的确定需要根据flash的手册确定,一般是32K/64K,我当前实验了,在T20平台上这个参数只能是32K,如果选择为64K,系统会出现大量的打印错误

[    1.449483] jffs2: Node at 0x000076d4 with length 0x00000ab5 would run over the end of the erase block
[    1.459179] jffs2: Perhaps the file system was created with the wrong erase size?
[    1.466973] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076d8: 0x0ab5 instead
[    1.476829] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076dc: 0x0f09 instead
[    1.486675] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076e0: 0x0015 instead
[    1.496517] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076e4: 0x000e instead
[    1.506360] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076e8: 0x81ed instead
[    1.516202] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076ec: 0x03e8 instead
[    1.526043] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076f0: 0xcd00 instead
[    1.535884] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076f4: 0xefb7 instead
[    1.545727] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076f8: 0xefb7 instead
[    1.555569] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076fc: 0xefb7 instead
[    1.565408] jffs2: Further such events for this erase block will not be printed

这个命令还可以用一个-s参数,如下:

mkfs.jffs2 -o rootfs.jffs2 -r rootfs -e 0x8000 -s 0x40000 -n -l -X zlib --pad=0x300000

这个参数可以提高jffs2文件的压缩比,但是也会降低系统的启动速度,故而建议可以在生成roofs.jffs2时,默认不使用这个参数,实在需要压缩空间时,再启用这个参数。

3.生成最终的img

dd if=u-boot-with-spl.bin of=isvp_sfcnor${DATE}_$1.bin
dd if=uImage of=isvp_sfcnor${DATE}_$1.bin bs=1024 seek=256
dd if=rootfs.jffs2 of=isvp_sfcnor${DATE}_$1.bin bs=1024 seek=2816
dd if=appfs.jffs2 of=isvp_sfcnor${DATE}_$1.bin bs=1024 seek=5888
cp isvp_sfcnor${DATE}_$1.bin  ../../tftp/

这里面需要计算好seek对应的偏移位置
————————————————
版权声明:本文为CSDN博主「lh2016rocky」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lh2016rocky/article/details/54668411

`