EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在ARM-Linux使用JPT-7模块来跑GPS应用.Nand Flash 空间太小,而且所用的板经( K5 p6 ]7 w0 Q @
常烧不了根文件系统.所以决定用SD卡来跑根文件系统。
. Q, b% g: L; m# {1.PC机上格式化SD卡 ( |7 \. s9 l5 ^- D( V. d! Y
在桌面的PC机上用SD读卡器操作SD卡:
2 K9 L; n5 T$ N% h4 a ] 一般情况下PC机上第一个U盘整体设备结点是/dev/sda,第二个是 /dev/sdb,在RHEL5下它会被# V1 E U) k* o$ {
自动mount到/media/disk和 /media/disk_1 目录。
9 h. A6 f$ G3 o7 y U盘/dev/sdb上第一个分区是 /dev/sdb1,第二是/dev/sdb2 依此类推。 根文件系统采用符号链接等特性,用FAT32是不行的,这里直接采用标准的ext3的文件系统.在实测! ^' j1 q \9 u5 E
时,把U盘整个做一个分区做ext3根文件系统.总 是出不少问题(可能步骤也不对),因此按网上推荐的,: g. P L( @5 V6 }8 e7 ^# s
做二个分区,第一个分区采用vfat格式,第二个分区才采用ext3的格式。
# L% j. \) {6 ~" N9 Y( h }1.1 用fdisk分区
' I6 A. I5 [* G3 _! \; k y- i 执行fdisk /dev/sdb+ D+ g3 L5 j& q Q" [8 Z& G
fdisk有如下常用选项8 M9 }( L; k9 f- C$ L4 O
1. 输入 m 显示所有命令列示。 : Q e; c2 I) s, }+ G# ~9 G) j
2. 输入 p 显示硬盘分割情形。
6 a2 d6 e! M0 A: \3. 输入 a 设定硬盘启动区。
9 Y \( o/ I r2 }7 G8 F$ G4. 输入 n 设定新的硬盘分割区。 . v9 Q! w6 w- `3 T Q/ X
4.1. 输入 e 硬盘为[扩展]分割区(extend)。
, Z r5 h# Q* q' }2 ]' H- v- \ 4.2. 输入 p 硬盘为[首要]分割区(primary)。 " g1 Y/ o0 C! t q$ |+ ?4 j3 ` X
5. 输入 t 改变硬盘分割区属性。 % v( Q) E4 J' E Y- ] x
6. 输入 d 删除硬盘分割区属性。
2 Y. D0 R& ?& t6 U7. 输入 q 结束不存入硬盘分割区属性。
* m+ q. C! {! T8. 输入 w 结束并写入硬盘分割区属性$ H( d3 m, N. j, b
如果以前U盘有分区,需要输入d命令来依次删除分区,以下执行两次n命令创建一个 400M的FAT分# q$ Y2 ~8 ^& t( j! X0 k6 c
区,以及把剩下的分区设为ext3,最后用w命令把结果保存下来。 G/ |( {: B* m, I: c4 o8 S2 ^
Command (m for help): n
; m& ?" v P* t& ?Command action$ @" K5 g( G( {# V d6 A
e extended! `! `* Y" }4 g0 C6 e
p primary partition (1-4)3 o6 t6 N, P# w# ^- f& T) {- c
p1 ?! T% R8 R- t7 U
Partition number (1-4): 1% i# R3 P6 I: j& H( B0 K
First cylinder (1-1020, default 1): ; A2 @2 T5 t( t. q
Using default value 1
3 N2 A* j3 ?. M) E( H8 TLast cylinder or +size or +sizeM or +sizeK (1-1020, default 1020): +400M) G$ X% c# ~& z/ x8 i$ @
Command (m for help): n q+ r2 Z. P5 x, G# W1 ]4 q
Command action
' \. X' s5 m% H. s0 `+ A! E% g e extended$ C2 |) u. _8 Z6 h5 m8 i
p primary partition (1-4)7 V n5 ^4 i, b6 b9 ?$ t+ B
p
_) ^( k0 K0 L! sPartition number (1-4): 2
2 e0 i( Q1 X0 N* ]First cylinder (202-1020, default 202):
& l9 r% R# a7 s5 N$ |) FUsing default value 202
% {: P0 O$ B. b0 r3 HLast cylinder or +size or +sizeM or +sizeK (202-1020, default 1020):
& X" i! Y% f9 [Using default value 1020( Q5 @/ y/ k- ~
Command (m for help): p
4 g5 b3 Z1 e P+ e e/ uDisk /dev/sdb: 2041 MB, 2041577472 bytes 5 P) h$ N; p. I6 u: w9 U
63 heads, 62 sectors/track, 1020 cylinders
# w% Q* A! ]; `& x3 PUnits = cylinders of 3906 * 512 = 1999872 bytes
9 g9 ]+ p. {- `- Q Device Boot Start End Blocks Id System
; D- w1 s1 i+ M+ B, }, L/dev/sdb1 1 201 392522 b W95 FAT325 a, N9 k8 q% v j% ?0 e z; F& Y
/dev/sdb2 202 1020 1599507 83 Linux2 u4 [9 s/ c/ r. V7 J7 W
Command (m for help): w: z: p1 j8 o# Y4 A" Y
The partition table has been altered!9 f7 V ?* u; X* | W
Calling ioctl() to re-read partition table.
' z1 V L- a; Z+ j" U2 a5 ^3 V eWARNING: Re-reading the partition table failed with error 16: 设备或资源
) v" ` K+ [6 O( `1 j' V) {2 I忙.
' `8 v! Z- \. Y& l! JThe kernel still uses the old table.: W; Q4 a: F8 k; y8 w
The new table will be used at the next reboot.
3 {. ~: F0 V$ QWARNING: If you have created or modified any DOS 6.x1 `- @! n S0 _+ m4 ~2 L
partitions, please see the fdisk manual page for additional
0 t0 B$ H( b$ D- S* u) `$ A9 _information.+ M( r) w4 Q6 h# s* ]! R
Syncing disks. % Y4 X q5 l+ T0 S- o2 j8 [4 F# p; y
1.2 格式化分区) M" k$ b$ S h3 t% i, E0 D; p
mkfs.vfat /dev/sda1 #第一个分区格式化成fat326 |2 G7 L& a+ [* x9 ]
mkfs.ext3 /dev/sda2 #第二个分区格式化成fat32
& t1 f8 n: m7 @ J) L 可以用 " G' U" n* c9 s) R
tune2fs -l /dev/sda2 来检验分区类型 # b1 X) z7 g( J* ^* t
1.3 拷贝根文件系统
& v" W7 n ?0 ]* o% j mount /dev/sda2 /mnt/sdcard #挂载SD卡
|/ K3 r5 v! H2 x cp -ra /home/hxy/rootfs/* /mnt/sdcard #把根文件系统拷到SD卡
; D5 w& W) F- P+ \$ O! k2. 编译 ARM Linux 内核
7 R8 g( [' J# J" G2 n, v8 y! r 2.1 修改内核配置
N) y2 L2 J* I6 C" H5 C 确保ext3的文件系统支持,和SD卡驱动都被静态编译到内核,我使用的是Linux 2.6.29.1 `6 t4 Z2 I4 I# X3 K4 `% g
在内核源码目录执行 make menuconfig! r$ V# b i5 I) \: F
其中ext3在File system下.成功的配置如下。1 {9 Z; t4 E y: h( T6 K
<*> Ext3 journalling file system support
0 t/ \* r1 O% ~4 C( q5 J- Z& {7 f4 H; X Ext3 extended attributes $ s! W1 {: A! I& C% \& T' [; g
Ext3 POSIX Access Control Lists Ext3 Security Labels
' u+ U1 B7 M7 e' W! x5 J. _SD卡驱动支持在Device Drivers ->MMC/SD/SDIO card support 下,成功的配置如下# A$ Q6 K9 O* A, Q. y5 M
--- MMC/SD/SDIO card support
9 g9 X3 ]0 |1 ?! G. _* N MMC debugging
9 e5 j- J/ [; |* [/ E+ H [ ] Allow unsafe resume (DANGEROUS) * ?0 \: W9 ~+ V) Q. R' n
*** MMC/SD/SDIO Card Drivers *** 9 l |% `8 E& D0 z! E; m+ ]
<*> MMC block device driver
' i. }9 M& R* E% K- M# Q4 h Use bounce buffer for simple hosts # S# p/ `4 `5 o7 E. j
<*> SDIO UART/GPS class support 2 L9 G" M4 z. H" }2 `: ~3 R$ l( @
<*> MMC host test driver
4 j# w, z6 H/ R *** MMC/SD/SDIO Host Controller Drivers *** n5 G6 H' W3 x! c. R2 d% Z
<*> Secure Digital Host Controller InteRFace support
3 y& ?7 k3 o; V- p <*> Samsung S3C SD/MMC Card Interface
$ g) Q s" z& L) gsupport
! w, }8 X) u( h* b0 y4 i7 h3 a 编译内核 make zImage
# n( U4 `2 O+ _) K3 x7 y# U2.2 在ARM-linux下的测试.
( w: H5 r! k& L, h 在一个已经正常启动的ARM-LINUX下,插入SD卡.出现如下提示,表示SD卡已经安装上' N8 N4 W0 |" [1 ^* B# I0 k4 |6 g _
[root: /]# s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz).
; g( {2 F; E+ Gs3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
5 o8 B% h1 z: z" H E" W! `( ns3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
. E& D& R6 v. ]* T! N/ vs3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
" p4 ?- r5 D6 Ns3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). , G% B" t. L( ^: R4 Y' E
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). ; r- u% D- w2 }; X* ]
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
. a6 M* N* K& _9 }s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). 2 R. M d6 s6 p" y6 R. c
s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz). 0 G3 x5 |0 H8 d# V5 n, e1 A
s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).
0 U9 G3 X6 q# z4 j2 ~- y' }mmc0: new SD card at address 0002
$ z- u2 F+ h4 N3 a( X: Jmmcblk0: mmc0:0002 00000 1.90 GiB 0 z8 W5 ^: M" i3 S+ V/ \( Y
mmcblk0: p1 p2 * W' A# b2 V' B
FAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case3 T% _" E8 D) N/ m: ?# `
sensitive! , T7 s) _. C7 ~% T- Y7 i: F6 X, J
但是最后一句在提示FAT有不识别的IO字符集,导致第一个VFAT分区没有自动创建设备结点.用如
9 H5 o7 v: \4 W. F下命令只看到mmcblk0p2的结点.(以下操作均是在开发板上进行)/ P! r* {& z: C. d
[root: /]# ls -l /dev/mmc*
$ q8 w4 S& N! }brw-rw---- 1 root root 179, 0 Sep 22 10:48 /dev/mmcblk0 * L" g- |8 z3 B; ]
brw-rw---- 1 root root 179, 2 Sep 22 10:48 /dev/mmcblk0p2 4 C. G Y2 l4 _( Y
测试ext3分区
. \4 o- ]! I+ n" F J( emount -t ext3 /dev/mmcblk0p2 /mnt
$ J# v c4 Z8 `- T- b7 R8 |5 e+ H% U在/mnt上可以读写文件.表示ext3分区正常.6 c* W+ m6 a- s2 I" o
手动建立第一个分区的结点./ G W2 x' h) {6 T% j ~2 J; M
mknod /dev/mmcblk0p1 b 179 1 # j' ]/ z: H. u% h/ J" ]
测试vfat 分区
+ m: A; T/ M$ B3 E. D! cmount -t vfat /dev/mmcblk0p1 /mnt6 O) T6 @3 K) |/ _7 o( ?. E
在/mnt上可以读写文件.表示vfat分区正常.如果想自动创建个设备结点,可以修改/etc/fstat来使用
& I6 F* q. }& Q: `' J这个分区
7 N" {) m: w0 O' F: Y5 c( X3. 使用 SD 卡分区作为根文件
, V0 [/ H/ c) {- a7 _ 修改LINUX启动参数.我用的是u-boot .因此在u-boot shell用set bootargs命令来设置Linux启动6 p! {: L( ?" G- s
参数。1 x+ G1 k7 q k" t: z/ |. e0 R
成功的启动参数是 noinitrd root=179:2 rw console=ttySAC0
6 w. U3 r+ e1 u4 ?9 s0 B t# Y其中179和2是sd卡上ext3分区的主设备和从设备号。$ Y$ v! }& o: q2 m, B
用set bootargs "noinitrd root=179:2 rw console=ttySAC0 "设置后.重启内核,即可用ext3分区作
4 q* j J' r+ e为根文件系统。 1 H7 M* q) n1 H3 l5 w; G: v: H+ O
PS:如果根文件系统不能正常加载,并且报错信息和下面类似: ) |3 a. {) z8 v6 {8 n) ?" T, c7 S
.......
; ~8 A% o/ Z' G& W9 l% t VFS: Cannot open root device "179:2" or unknown-block(179,2)3 X& P" Q3 ~" [4 i) Q
Please append a correct "root=" boot option
0 m8 g, z6 U4 n) O6 m" wKernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2) . z% B' N2 B% K' H
|