EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在ARM-Linux使用JPT-7模块来跑GPS应用.Nand Flash 空间太小,而且所用的板经& G7 _( c3 z9 ~) G: `0 Q W
常烧不了根文件系统.所以决定用SD卡来跑根文件系统。 6 C; f& c E/ f1 _9 O) @9 D
1.PC机上格式化SD卡 / G* a& \# f( E0 N3 ^. \- D4 |
在桌面的PC机上用SD读卡器操作SD卡:
& B. |: ^; x+ U 一般情况下PC机上第一个U盘整体设备结点是/dev/sda,第二个是 /dev/sdb,在RHEL5下它会被
9 v$ w3 I! t, n自动mount到/media/disk和 /media/disk_1 目录。' L* H# t7 C! d& I5 F
U盘/dev/sdb上第一个分区是 /dev/sdb1,第二是/dev/sdb2 依此类推。 根文件系统采用符号链接等特性,用FAT32是不行的,这里直接采用标准的ext3的文件系统.在实测" K* v& }, V, |' C
时,把U盘整个做一个分区做ext3根文件系统.总 是出不少问题(可能步骤也不对),因此按网上推荐的,6 \5 S* R# e2 n2 F- N8 W" ]
做二个分区,第一个分区采用vfat格式,第二个分区才采用ext3的格式。
) {- [; U$ P# j2 O5 f" x1.1 用fdisk分区
- Y. F1 s( Q$ {, X# H 执行fdisk /dev/sdb
' g8 p- A! Y j7 Y2 n fdisk有如下常用选项
! d0 Z4 v2 V% Q4 e# x* c1. 输入 m 显示所有命令列示。 4 {* r/ u( \- i8 f7 i
2. 输入 p 显示硬盘分割情形。 ) O; ^* c/ L0 q4 q
3. 输入 a 设定硬盘启动区。 2 r5 @- L: _" ]5 d$ p
4. 输入 n 设定新的硬盘分割区。 ) u8 r `0 G( ?* Q
4.1. 输入 e 硬盘为[扩展]分割区(extend)。 ; t2 B9 U3 n3 d# ^/ s6 G* d; J2 W
4.2. 输入 p 硬盘为[首要]分割区(primary)。
) t# f. k+ ~9 o# |5. 输入 t 改变硬盘分割区属性。
3 E- p+ Q/ D4 j& S4 A, I8 E j6. 输入 d 删除硬盘分割区属性。
3 p4 @$ G3 k0 ]7. 输入 q 结束不存入硬盘分割区属性。 , r, ?, V5 O; ~3 c) `1 K7 I
8. 输入 w 结束并写入硬盘分割区属性+ a: p2 ?6 @/ g
如果以前U盘有分区,需要输入d命令来依次删除分区,以下执行两次n命令创建一个 400M的FAT分
0 F$ H( N- o4 k$ i: [) |9 }区,以及把剩下的分区设为ext3,最后用w命令把结果保存下来。
$ W1 w+ N* s/ ?) `Command (m for help): n) l: L; s4 Z/ D0 ]+ A) V" Y9 D
Command action& |# L( w. J4 Y. ?2 A
e extended! \7 f# ]- ?. \. n; m8 X
p primary partition (1-4); t6 Z b3 O; J u4 G1 ]. l
p
7 s3 l) U/ {/ i; {. kPartition number (1-4): 1" M$ {. e5 r6 v
First cylinder (1-1020, default 1):
6 c! x6 {! w/ u- |; bUsing default value 1
8 D4 v$ V1 z" h$ G H+ i% PLast cylinder or +size or +sizeM or +sizeK (1-1020, default 1020): +400M
, o, \4 Q6 x: q5 NCommand (m for help): n- S2 |1 Y' v$ f* G
Command action& K% @# U) \/ C- D r/ q
e extended% O9 Q1 @ O% ?
p primary partition (1-4)
) W5 `' |$ @+ o2 I* ]6 B# q5 T4 Pp8 m7 F3 R% C- H1 A+ E q$ s
Partition number (1-4): 2: O* k+ x9 |6 N& f
First cylinder (202-1020, default 202):
, F$ Y0 D% Q' R$ M9 S: ZUsing default value 2020 O1 V8 E" _: p! b% y8 T
Last cylinder or +size or +sizeM or +sizeK (202-1020, default 1020):
" L6 G! C! w' n; n& Q+ B$ pUsing default value 1020
0 ~9 v/ u4 T; e: W2 B* r3 g" T8 W# vCommand (m for help): p; x' N' y# X. U, y+ U/ M& _
Disk /dev/sdb: 2041 MB, 2041577472 bytes * @$ H8 ^3 v* Y. s z/ X9 K
63 heads, 62 sectors/track, 1020 cylinders
9 ^& c0 y# m0 @5 dUnits = cylinders of 3906 * 512 = 1999872 bytes* I1 I8 H3 {. H& }) r
Device Boot Start End Blocks Id System
) X$ m- p: N% a( E/dev/sdb1 1 201 392522 b W95 FAT32
. t9 x' Q1 f9 i0 [. @/dev/sdb2 202 1020 1599507 83 Linux7 w5 X! M( q! W
Command (m for help): w
7 G+ y! D2 _8 D8 QThe partition table has been altered!/ t' R6 F2 F& K4 P9 M
Calling ioctl() to re-read partition table.9 I( [1 i+ M2 C# k' C! {) W
WARNING: Re-reading the partition table failed with error 16: 设备或资源
1 ]% s* N' L8 C0 `# L6 I忙.$ z0 b8 k, }$ O; R* c7 f
The kernel still uses the old table.
7 F& x" ]* V G- C/ ZThe new table will be used at the next reboot.
) p$ w. V, m$ S" d! e( Z5 d. y4 iWARNING: If you have created or modified any DOS 6.x
& \+ R1 W$ h' {' cpartitions, please see the fdisk manual page for additional! `! F `; M& B& x
information.
( C# \, P4 S, `4 s i, \- ZSyncing disks.
! s% x# _) z, M1.2 格式化分区- B+ P& A" l3 J, T# |
mkfs.vfat /dev/sda1 #第一个分区格式化成fat32/ Z9 A% @; x6 p* @( h$ S0 ?
mkfs.ext3 /dev/sda2 #第二个分区格式化成fat32, u, \ \) l j! C
可以用
4 |& i. n' k5 l$ q% X2 [ tune2fs -l /dev/sda2 来检验分区类型
! G; d* ^3 E9 r$ o j2 k1.3 拷贝根文件系统
$ A( n3 i! o4 ?- V9 v A M6 ` mount /dev/sda2 /mnt/sdcard #挂载SD卡 ( f0 X- V. k' ?* e- W ]$ ]
cp -ra /home/hxy/rootfs/* /mnt/sdcard #把根文件系统拷到SD卡
! M; q$ L) C, C2 y& H2. 编译 ARM Linux 内核 8 J: g1 A8 S0 M' H
2.1 修改内核配置
% X2 x; {% } x 确保ext3的文件系统支持,和SD卡驱动都被静态编译到内核,我使用的是Linux 2.6.29.3 X* \& S8 Y1 i
在内核源码目录执行 make menuconfig
% X( Y' W2 M' b6 X5 J0 X 其中ext3在File system下.成功的配置如下。
9 Y* J0 @- r/ ]8 g& P, H <*> Ext3 journalling file system support 6 G q$ q2 {5 ]5 V
Ext3 extended attributes
) a% J3 h7 z% |. N y2 }' E% Y* |& F Ext3 POSIX Access Control Lists Ext3 Security Labels 8 g4 q: L4 M4 j8 q0 a% F
SD卡驱动支持在Device Drivers ->MMC/SD/SDIO card support 下,成功的配置如下
. U7 L6 Z7 X! o' \ [( H3 E --- MMC/SD/SDIO card support + G" ?1 N5 q/ E* E( O
MMC debugging
# l$ t# ^3 K$ n+ ~9 i c [ ] Allow unsafe resume (DANGEROUS)
6 d: ?* l4 m* ~1 d( }4 `+ ~ *** MMC/SD/SDIO Card Drivers *** & ]. P0 b2 _% ?' W
<*> MMC block device driver + j3 m5 Y- ~4 s3 V! [2 X: ?5 N: D
Use bounce buffer for simple hosts + j& R* _; F7 o+ L/ j# s6 C
<*> SDIO UART/GPS class support $ v2 g$ o% m* `7 B! B+ _7 d5 b
<*> MMC host test driver 9 h \/ R& A* {# R \5 m0 m6 t
*** MMC/SD/SDIO Host Controller Drivers *** % D# e& P! N0 J9 L- |* U! E
<*> Secure Digital Host Controller InteRFace support
. W$ {/ r( m% B2 H) [5 C; G0 x3 @ <*> Samsung S3C SD/MMC Card Interface
! a, M6 H/ Q, x5 K! e3 nsupport i# L, w1 e7 E8 j5 W6 k3 A0 u
编译内核 make zImage6 Y( N. ` b/ t- [* r5 o
2.2 在ARM-linux下的测试.6 g9 `: u y& o4 x+ T0 n2 Y
在一个已经正常启动的ARM-LINUX下,插入SD卡.出现如下提示,表示SD卡已经安装上
9 r4 f* L9 N# P& L( F0 h[root: /]# s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz). + |+ ?7 }" C# j8 ~8 Q
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
3 s( A0 U6 p3 xs3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
% y* W0 {: F$ c- `6 [! Bs3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). ; z( `6 c* m4 D( H7 s. R
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz). 6 z" ` u3 n/ E2 p. F' H
s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
: n+ L* F' O5 T" P% {s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
; T- P( V/ I1 A& f0 V7 o; B! F& }s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 197kHz).
$ T$ S4 U, H5 X! T; ~/ Js3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz). , ]! v/ b2 \: z
s3c2440-sdi s3c2440-sdi: running at 16875kHz (requested: 25000kHz).
$ O2 K6 U% s9 s4 a K9 q, C0 Fmmc0: new SD card at address 0002 & w* j# X- b$ t. _" E" U4 h3 P$ }
mmcblk0: mmc0:0002 00000 1.90 GiB
2 C% t3 O/ s5 S. K6 P6 S3 t% \) x mmcblk0: p1 p2
5 H9 @. r8 H) g- J7 J9 D4 SFAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case
& O. v+ G3 j+ ]sensitive!
% |9 a/ f) b( h+ R) `但是最后一句在提示FAT有不识别的IO字符集,导致第一个VFAT分区没有自动创建设备结点.用如. e) _* w0 \2 ^" \! J
下命令只看到mmcblk0p2的结点.(以下操作均是在开发板上进行)3 B0 D5 |) O7 u; [5 N4 G
[root: /]# ls -l /dev/mmc* ( g1 B5 E* ~) Q2 e0 Q/ v
brw-rw---- 1 root root 179, 0 Sep 22 10:48 /dev/mmcblk0
# T9 \! X) Q. m' v. ]4 Vbrw-rw---- 1 root root 179, 2 Sep 22 10:48 /dev/mmcblk0p2
- E; ^" W6 P ]! C H测试ext3分区, t0 Q# l1 A. D" E" L; A
mount -t ext3 /dev/mmcblk0p2 /mnt
" @6 ]6 i8 \5 K) ]2 N5 T$ z+ q在/mnt上可以读写文件.表示ext3分区正常.8 X4 G" ]. f6 f; E8 w6 }( l
手动建立第一个分区的结点.
- m" |' p5 P9 g7 s5 @# F fmknod /dev/mmcblk0p1 b 179 1 2 P( u9 J" a4 Z2 q6 q
测试vfat 分区
/ j2 h) O. q6 Q9 J) vmount -t vfat /dev/mmcblk0p1 /mnt# W# @+ [9 |; N+ j6 S
在/mnt上可以读写文件.表示vfat分区正常.如果想自动创建个设备结点,可以修改/etc/fstat来使用) @6 }/ k* }- X$ `! n
这个分区2 R: N" S. n/ P8 V
3. 使用 SD 卡分区作为根文件
8 t% j8 l3 T, Y 修改LINUX启动参数.我用的是u-boot .因此在u-boot shell用set bootargs命令来设置Linux启动
0 F( S3 q7 C s) C* s) ^% {& p" e* Z参数。
0 N/ \% ]$ X! |' L ` 成功的启动参数是 noinitrd root=179:2 rw console=ttySAC0
! ?4 L$ D- X. V- g其中179和2是sd卡上ext3分区的主设备和从设备号。$ ]! h R3 \( p' U: Z
用set bootargs "noinitrd root=179:2 rw console=ttySAC0 "设置后.重启内核,即可用ext3分区作
( a1 ^0 y$ O. c- Y( v4 I为根文件系统。 / N! f! _4 \2 J, j* x R, P
PS:如果根文件系统不能正常加载,并且报错信息和下面类似:
1 k9 x/ E0 O% {9 T& u9 R.......! k9 ]3 O' p" g+ z; L& w
VFS: Cannot open root device "179:2" or unknown-block(179,2)% M8 y Z# `. S3 N
Please append a correct "root=" boot option
9 j: Z% T3 Z* m4 YKernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2) . C1 P) S j* s* ~, o% C7 o
|