EDA365电子论坛网

标题: ARM平台建立JFFS2根文件系统 [打印本页]

作者: pulbieup    时间: 2020-6-9 14:16
标题: ARM平台建立JFFS2根文件系统
开发板:TQ2440
, B% ]% ?8 N1 X" [1 G5 |$ g1 q7 o! v6 j3 Q; }" W
内核版本:2.6.32
7 M" v  _2 d( i* }) V& F& Z' t
Nand flash:K9F2G08U0A
! `% k: \4 k: q0 [! r% l/ W
. |8 k: b- S7 b4 h9 }" L本文将对JFFS2文件系统的编译和烧写做简单记录,本文的内容建立在如下三个基础上:1 u& N$ T( K8 |" f

! f5 |' a# q$ s% o" n4 S! `( u" {1.  完成使用Busybox编译出所需要的工具。9 |5 ?* Z6 o# i( r
# z# E6 C# R* [! r# N6 p6 u/ S
2.  完成添加根文件系统所需的目录和配置文件。
9 ^& {( c; }# c/ R7 M$ ?& {
' \- Y' c, T' ]2 d4 ^9 Q3.  开发平台上有mkfs.jffs2工具(ubuntu自带该工具)。9 u8 Y5 N$ M% O" u) e

- ^  y5 U+ i4 m$ ^9 t( }- H0 a. e6 S$ P: f6 |! t) J  P3 S/ b

6 ^! x, o4 h5 X" _第一步:配置内核
" Y! |5 F' K  P' c1 N) ]5 @6 Q. i) H  c
选择JFFS2文件系统:# C3 J( m: n* j6 O" M" S7 j8 L1 k; }
" G5 ?* C* ^# s* R: D
/ p" r" @5 Y$ \6 S# e8 m: W
$ R* L0 o" [3 |3 z2 }/ D

+ u& L- e1 j8 N# U) E% G+ O6 B- c6 ^) s
禁止ECC功能,根据参考资料2,JFFS2会采用自己的ECC算法,因此无需开启硬件ECC功能。
- |& X# n& z* X: d2 E' I! u8 e* o
' H) B: m! V% V! f* y* x
9 q/ c0 v2 `2 d2 N/ G( Q7 T

0 `( l/ @" v6 `% F* l第二步:编译文件系统
# R/ F, J. X2 ~, z$ H6 n1 z- _, h
使用如下命令:- i: _7 ~+ d+ g- Y' U5 M5 L, Y
4 J1 q$ A5 A7 X3 F- Q* X
mkfs.jffs2  -s 0x800 -e 0x20000 --pad=0x800000 -l -n -d ./myrootfs -o jffs2.bin7 ~/ I% }9 x' }& ~
2 S) v+ h( |' m+ q7 }3 O
其中,5 I7 f4 }' O* P" {2 [9 I
- L' i0 h! J& r
  -s 和 -e 分别为nand flash的页大小和块大小,开发板所使用的nandflash为K9F2G08U0A。
3 N% b& q/ u' R
! q2 ~8 q9 k  H/ S5 v  查看手册可知其大小,- J5 b( f  f0 D; f

8 P/ }+ R' s7 N, o! d: ` ( n- }% _# O0 J& n* a5 d  P/ V$ b: Y
. h8 l8 G( i/ `. g, i( s
/ k7 W4 H/ P, d$ h4 J
  页大小=0x800 = 2048Byte = 2KB,! N. ]" z0 t+ k! ]2 F
8 e* @% U% E; j  c" S
  块大小=0x20000=131072Byte = 128KB。
7 y/ k4 E" N9 Z" k3 d+ V% Z5 I
% ]. {, d: ?1 u) O  h; Q& }' P  -l 表示使用小端模式..
# V& \: g# e! g, U- a, d" }% c; C) }  F$ x7 [2 s
  -n 表示不实用cleanmarkers,如果不添加该参数会有如下类似的警告:
! ?# {+ ~/ l5 P8 f, e8 O5 Z/ @
" f3 v% C% ]( E3 J  CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0
9 q9 o' e# ^+ C9 L0 g
5 f  L" G4 V3 j7 K% ^% v+ c! k2 G& f  --pad 用于填充空白区,填充内容为0XFF,如果产生的文件小于0x800000,将填满至0x800000。也可以直接使用-p参数。( P( e- x3 H1 z6 t2 e% y. x
( i- |/ `! ?$ E8 O3 I
  -d 表示文件系统所在的位置。
( a; E0 p8 j  f2 v5 d/ h# y- M0 o) H8 m; z( Z( ~, X
  -o 表示生成的目标文件的名字。
0 r2 v% ~( i" B) n! p8 i, \% y3 d1 i% s$ U9 P, k3 c! k
执行上述命令后,我们将得到编译好的JFFS2根文件系统。& m7 e% d' ]' I$ D- |, e

: E. |/ @; b$ R8 E" R( s# A) }& J. R' j7 @: }

2 p2 T( Z6 f4 q8 K$ ?  ^第三步:修改Uboot的内核命令行
# \8 \! Y- \% \: r6 I% O4 q* ?: K6 u4 `6 m: F
此步的目的是告诉内核根文件系统的类型为jffs2。+ L6 Q$ U8 x" a  `, |1 ?. h2 K/ v

! D2 \, E. Y: x7 k6 g! F4 c4 f( fsetenv bootargs noinitrd root=/dev/mtdblock3 console=ttySAC0 init=/linuxrc rootfstype=jffs2
/ T3 O1 G( C2 Z0 k7 [. s( v: L" T' s: u$ E2 |) L/ W+ d
( H' u& E& ~2 t5 K+ |

2 }" D' e' q: @' A' ^2 b" i8 I" n第四步: 烧写JFFS2文件系统至nand flash 中' W0 ^$ c: b9 Z9 i; [

' o8 @( S. r: g8 W8 m* b首先,看下我的分区表:; V5 S4 O+ Y! t3 i
/ F: m" m, F7 k/ H
[root@yj423 /root]#cat /proc/mtd2 a+ R8 M% n: o' K0 ?4 v! x
dev:    size   erasesize  name+ ~% c" ?) w& h  \) J
mtd0: 00800000 00020000 "mtdram test device"
0 ~) [* u" r" j7 F# smtd1: 00040000 00020000 "Uboot"
8 i: [9 k; ~4 Z1 E4 R6 Smtd2: 00300000 00020000 "Kernel"% l6 o( \6 d/ d. J/ j
mtd3: 0fb00000 00020000 "filesystem"8 s3 T, L2 N! O' v! N, j3 w$ ?( @1 h
[root@yj423 /root]#cat /proc/partitions
* D( u- c3 e* N' Qmajor minor  #blocks  name
0 A: X9 L6 D: ^. o7 J2 Q; ?. j# J. n- x7 s- A
  31        0       8192 mtdblock04 T2 I* `1 ^8 d0 p
  31        1        256 mtdblock1
7 ]9 N; M& v& O) t5 Y+ ?5 ?4 c  31        2       3072 mtdblock2
+ S5 ^$ d0 v5 J+ s/ Z. r. N) b: ?6 }  31        3     257024 mtdblock3) y8 a; ?) ~/ L4 r" u! K9 E

2 y8 w; f. Z. ?/ P7 U1 |. V
; ~; G0 J* w& J5 s
2 }3 j/ j! }! O' N# gmtdblock3 为文件系统所在的分区,起始地址为0x500000,长度为0xfb00000。( a: x0 |6 d' n$ i3 j% u

. @5 u8 W$ B4 l所以第三步的root参数为mtdblock3,请留意!
9 a, w6 j( e& P  s5 V& y5 F, n4 W1 p
开始烧写,请注意烧写的起始地址和长度。
; q, @. t0 C/ X- l. S2 j  e- q+ I  M  E/ @
tftp 0x31000000 jffs2.bin7 y  [: S% m! B9 T. ]/ _3 h
nand erase 0x500000 0x0FB00000
6 K6 O( C! K' D& v0 s, vnand write.jffs2 0x31000000 0x500000 0x800000
) K) d+ V5 x* |; R" S- c! z
( p. b: C9 L8 K# f" F( U# K0x500000 为mtdblock3分区的起始地址,0x800000为jffs2.bin的文件大小,该值在tftp传送成功时会显示出来。
( y$ e  K4 R# V+ Q9 G' j: x7 l) O" v  J$ Q4 T2 B
7 v2 [4 ~1 C. X, @! B8 G

0 v9 O: O7 T: ~最后,来看下内核成功挂载JFFS2文件系统时的输出:, B) Q8 q) {& @8 e

. e1 Q) Z1 n, k5 f......4 ]5 K2 W/ g- m. ]3 e
: _  A" }& W" _: u2 L, u9 S
VFS: Mounted root (jffs2 filesystem) on device 31:3./ j5 {' c$ b% Z& f7 \2 T7 N7 n
Freeing init memory: 156K: t. C8 T) e  E' u
eth0: link down
' v$ A& s  t7 f# g) }- h6 X: @2 z/ xeth0: link up, 100Mbps, full-duplex, lpa 0x45E1
! H' P9 U0 W5 S) h% E- {2 Z[root@yj423 /root]#
& |' a( B1 Z2 r/ D3 y' M
1 a0 A+ {, h) m9 ^
9 N& W! T% b" V9 K+ v2 g7 j0 p5 z( o3 H1 _; x

( O( i& T' ?! H$ g) E7 A& T: A; i/ a. ]
作者: CCxiaom    时间: 2020-6-9 15:25
ARM平台建立JFFS2根文件系统




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2