EDA365电子论坛网

标题: S3C2440 Linux驱动移植——SD卡驱动 [打印本页]

作者: pulbieup    时间: 2020-6-2 15:19
标题: S3C2440 Linux驱动移植——SD卡驱动
开发板:TQ2440
: F; G9 C: J7 N9 |4 L( V* ^. v- Q; D9 Y) J1 {' G
内核:Linux 2.6.32
4 ?" n4 U9 l+ @- p) f. S+ m6 i) ^, x! K' Y
PC OS:Ubuntu 11.04/ k5 c. w" i# X3 l, Q7 C6 N6 f
5 a! Q% d, a  @% \$ R$ X( y

5 Q5 x; H2 J9 [/ a+ `
3 r0 T& K& e1 I  v; [8 b) Y本文将对SD卡驱动的移植做简要介绍。
4 q0 g( V0 b0 C: G4 t4 x& R
9 R, X2 o  i# g# L  C8 h, Q0 e
7 T# t$ K3 |  n3 q1.  添加板级信息8 h3 c& i1 C( K# {0 ]) ]2 J3 a. d# M- a

! f7 t! m# z7 D/ @( n打开arch/arm/mach-s3c2440/mach-smdk2440.c。
' M( G0 ~  R' X1 f7 @
. d/ F' j" y$ Y( Y6 q. `7 f; o添加如下结构体:( j! i/ u& U% N# [

+ d% n! m( n4 m0 a/ @5 Q/* Added by Yan Jun for SD/MMC driver */
' c% g+ j. f; D& k/ C/*********************************************/
$ T4 o+ b: V3 ]# O#include <plat/mci.h>
- `! I6 w4 z, R5 ~- ostatic struct s3c24xx_mci_pdata s3c_mci_data = {
5 Q4 k4 s6 \( n: V- n    .no_detect         = 0,
* `# ]% k3 Y) g$ j    .gpio_detect     = S3C2410_GPG(8),
0 G9 {) ~* W4 j3 E" @! P" M    .no_wprotect     = 0,& ?4 J" [# `' \2 E) e
    .gpio_wprotect     = S3C2410_GPH(8)," z, s' J) P! D' O( m
};
2 |' T/ ]& ?0 h! T; q; m6 \; Q3 E# u" z* k0 @9 N% H
no_detect表示使用探测,也就是使用1个中断管脚来检测SD卡是否插入。$ R; `1 M0 _* B7 Q" \0 [3 m
no_wprotect表示使用写保护。4 p9 d* R- L* |+ D! j8 e* h$ o- J' ~

* |% l+ R9 Q( H+ A) ?gpio_detect和gpio_wprotect是根据原理图上的gpio来填写的,请参考你的原理图。# b7 A6 X6 H+ c

  J) j8 K! w) S! x$ z- O/ |2 A% V5 o, o4 Y2 v+ }" }4 A

6 ]- `* K- D9 h2 W# i添加如下函数:9 w" Q- l, [1 {8 J+ G

4 X4 L5 m$ ?: K0 g, K#if defined (CONFIG_MMC_S3C)8 Q( P7 U; Y$ I
void __init s3c_add_device_sdi(struct s3c24xx_mci_pdata *pdata) 3 t; F8 ?, m  ^7 Y+ R" I. e" ?" T! n
{
! C% P3 D. v9 I6 i        s3c_device_sdi.dev.platform_data = pdata;% f) M/ |" E& P! L2 v& |: W4 O
        //if(!pdata && !pdata->no_detect)! v0 S, E& @, d" ~, ?
        //        s3c2410_gpio_cfgpin(S3C2410_GPG(8), S3C2410_GPG8_EINT16);
: U; A+ `9 ?+ G9 T' p9 f4 ]% z        platform_device_register(&s3c_device_sdi);
1 q2 F5 X% K6 ?0 i. ^+ T}
% Q# r0 n7 `  n3 r5 N* A/ J#else) j: _2 z5 w5 A
void __init s3c_add_device_sdi(struct s3c24xx_mci_pdata *pdata) {}% w% |! ?$ i( c, L: l
#endif
5 t# q1 M5 p- W& ]8 N; d  I
8 F5 }1 Q7 `6 B6 ?+ w' A8 y3 q在smdk2440_machine_init函数最后增加:
! }7 j) p  S4 U" l/ \s3c_add_device_sdi(&s3c_mci_data);                        /* Added by Yan Jun for SD/MMC driver */
7 g, [: r" K6 C. Y! t0 E! p3 A, t% a1 S) R) u

4 }; h, m( b- H6 e2. 配置内核% X  w/ Z: M. ]

8 Q% k( G5 @. U, c7 J % P7 F; Q& k, p+ i% O
* c1 B$ J: J, u- `8 N% l$ R. s8 e+ z
+ P" b! h2 F+ i3 R( d" ?

$ {! u2 A! `. B+ L- v2 e! ^3. 编译内核并烧入
8 ]- y3 X0 S; w0 Y) l
$ k3 B: x2 G: D4. 修改/etc/mdev.config# V* }, B$ v9 j; T
修改该文件的目的是为了让sd卡可以自动挂载。
& b9 X; p& W* E% T  W/ C9 I7 X) e
3 F6 J7 E$ P/ }4 G* h, ?7 P8 t; J2 Q* A内容如下:$ g6 ~, N4 T3 f2 K' d
4 L  j7 P, f) ^( T
mmcblk[0-9]*p[0-9] 0:0 0660 @/etc/sdcard_insert.sh* d: [4 c# |1 _6 Z% q( C! i( N
mmcblk[0-9]* 0:0 0660 $/etc/sdcard_remove.sh
6 ^; o. i* U5 K) y) k/ y* j. |. B7 o
3 e+ v  S+ i( {) B这里调用了两个脚本,脚本如下。
. r' p- v, g  h% l  m) H$ H9 ^% O; }4 o0 \
[root@yj423 yj423]#cat /etc/sdcard_insert.sh & E8 m: Q: z9 L& t2 d
#!/bin/sh
- `& Q' t' }6 zecho "SD card insert action detected" > /dev/console
* |* N; _* R/ c) {) qecho "MDEV = $MDEV"  > /dev/console  q6 Y3 l' N' T; r0 B3 F
mount -t vfat -o iocharset=cp936 /dev/$MDEV /mnt/sdcard
) |6 n  E5 X# N# x
/ b9 Y  [" A8 G$ G. W4 e  @; _4 ~6 T7 [

/ s9 }% b5 e8 V& b' H' g[root@yj423 yj423]#cat /etc/sdcard_remove.sh
3 u# G3 _- `  H' t#!/bin/sh
* B' h( f$ e3 N. \* t; a& Fecho "SD card remove action detected" > /dev/console
  Y% i$ G9 ]9 ^echo "MDEV = $MDEV"  > /dev/console: _8 _4 R. D0 e; f1 Y4 ~* J+ M! P
sleep 11 I8 g) W+ U% i
umount -fl /mnt/sdcard/ \; K/ j* R5 I% A' H/ J  f* ^0 l
- z7 |1 g: c) \/ Y5 p7 T
最后,创建目录/mnt/scard 即可。
; |3 X6 D0 s' c/ X; @- R. f2 `& }) }) H4 k6 R7 g( X
SD卡插入后,会自动挂在至/mnt/sdcard。6 f" x* w' i3 p# }3 V. C6 o3 A

" y9 Z6 {( M) ?5 f; _  ]: r9 @" `2 m+ ^. [/ T( C
5. 验证  w1 ]! t( N! ?& l  q
首先看下设备文件:5 A5 ~( |: h1 a, M% ?1 M

$ M/ R8 `' f, d! W' |' [+ |[root@yj423 yj423]#ls /dev/mmcblk0*, O" E8 ^) N( v. a% q+ G8 x/ d
/dev/mmcblk0    /dev/mmcblk0p14 A) h/ @2 V+ C  t. @) Y

0 u2 _9 I, |+ H" ~$ L
$ D$ {1 L/ v9 T& T+ A$ e# h
/ j" ?3 \$ r+ Y( g0 b接着看下挂载情况:[root@yj423 yj423]#mount
* q1 i3 S( _% A1 nrootfs on / type rootfs (rw)% U) `& w+ R7 Q7 u) A$ r* X
/dev/root on / type yaffs2 (rw,relatime)9 i+ i1 Y+ \& o; {# r. w( {
proc on /proc type proc (rw,relatime)
' v; l' U5 W- N5 B) \# x! Qtmpfs on /tmp type tmpfs (rw,relatime)
4 H, G1 v! T3 C* h. psysfs on /sys type sysfs (rw,relatime)
' k0 Q% q# e* j: L6 ^, _" f0 I5 Ttmpfs on /dev type tmpfs (rw,relatime)# }9 A0 e) o7 t  T: Z
devpts on /dev/pts type devpts (rw,relatime,mode=600)4 L/ n5 z5 o* s, x) }% x
/dev/mmcblk0p1 on /mnt/sdcard type vfat (rw,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=cp437,iocharset=cp936,shortname=mixed,errors=remount-ro)
* ?! y4 n% e/ g& Q, Y0 t9 @  s  @$ x6 G9 i
最后两行显示了设备mmcblk0p1挂在到了/mnt/sdcard。
. T7 _4 P0 Z2 D& ^; _, n. E' k5 H: S# ~+ D* v+ M) g

1 n/ q' }4 T. k3 M  m/ x; F4 F- m6 M$ N, N5 I' f7 O* \4 J" j
最后,去/mnt/sdcard下看看。$ k  G/ |- P6 L$ w1 r
$ K' B8 ~( W3 o) s# u; Z: ]
[root@yj423 yj423]#ls /mnt/sdcard/
* `, }. h+ Y" E% S6 Q+ w3 ]DCIM  mp3- ?% w1 B$ A7 g) J  Z( q" x
# A$ `9 X! O8 m& u5 W2 N
6 z* U: M; h7 X& P# A2 J
; R: ]; X0 @% @4 T% P# N- K+ o
NOTE: 如果先插入SD卡,再启动系统,系统将无法正常启动,表现为无法进入控制台。原因待查。
$ c9 e$ F2 Q4 ]9 g0 k3 v
& w5 d  f3 z( X8 R
' E( h( `  L# J9 G$ s# S* X( I1 z7 D/ A! r& S. b7 u6 A

0 f6 }' w' _! L' Q! A) F
$ |! U: g0 h+ b  U9 p# n- E5 Z* R$ P' t6 G: m7 r
# i5 P( T; d4 X+ k" H* P3 W! i

4 L, N1 I- H0 M$ A  a! n$ c+ n: q% R6 E
0 d. B, M, B  ~7 P

( o7 A1 v; E2 q! J- R9 `3 B/ f( j- ^( H2 q% Y7 g* N7 E

作者: youOK    时间: 2020-6-2 16:00
S3C2440 Linux驱动移植——SD卡驱动




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