第23卷第10期2006年10月
机 电 工 程
M e c ha ni c a I &E I e c t r i c a I E ng i ne e r i ng M a g a z i ne
V o I .23N o .10
O c t .2006
收稿日期!2006-06-19
作者简介!刘 源(1983-),男,浙江武义人,主要从事嵌入式系统软~硬件设计方面的研究O
计算机应用
基于嵌入式L i n u x 的MMC /S D 卡驱动开发
刘 源!朱善安
(浙江大学电气工程学院,浙江杭州3100027)
摘 要!在三星A R M 9-S3C 2410上实现了M M C /SD 卡的硬件扩展!设计了此硬件平台上的M M C /SD 卡在L i nux 下的驱动!并给出了相应的关键代码#关键词!嵌入式L i nux %M M C /SD 卡%L i nux 设备驱动%S3C 2410中图分类号!T P 3 文献标识码!A
文章编号!1001-4551(2006)10-0050-04
D e ve l op me n t of MMC/S D d e vi c e d r i ve r b as e done m b e d d e dL i n u x
L I Uy ua n ,Z H USha n-a n
(C o l l e ge o f e l e c t r i c al e ngi ne e r i ng ,Z he j i ang U ni u e r s i t y ,H angz ho u 310027,C hi na )
A b s t r ac t :T heha r dw a r ei nt e r f a c ebe t w e e n t hes a m s ungA R M 9-S3C 2410a nd M M C /SD c a r d ,a nd t heM M C /SD L i nux de v i c e dr i v e r ba s e d o n ha r dw a r e pI a t f o r m w a s de s i g ne d.M o r e o v e r ,s o m e c r uc i a I c o de s w e r e pr o v i de d.K e y w or d s :e m be dde d L i nux ;M M C /SDc a r d ;L i nux de v i c e dr i v e r ;S3C 2410
0 前 言
目前,嵌入式操作系统有L i nux ~Wi ndo w C E ~V x w o r k ~P s o s 等,其中嵌入式L i nux 操作系统以其低廉的价格~开放的源代码~广泛的处理器支持,以及功能强大且易于移植等优点而得到广泛应用O 同时,随着嵌入式系统功能的增加,对数据的存储也提出了更高的要求O M M C /SD 卡以其价格~体积~读取速度等方面上的特点成为现今大多数便携式嵌入式设备的首选O
本研究以基于A R M 9(S3C 2410)和D SP (T
M S320C 6713)的嵌入式轴承故障诊断系统为对象,介绍了嵌入式L i nux 系统下的M M C /SD 卡设备驱动的开发O 由于SD 卡向下兼容M M C 卡,本研究将主要介绍SD 卡的原理及其驱动O
1 硬件平台
S3C 2410A 是由三星公司生产的~面向高端嵌入式应用的一款M C U O 是一款采用A R M 920T 内核,0.18卜m 制造工艺的32位微控制器O
由于S3C 2410具备203M H z 的主频以及M M U
功能,能很方便地实现嵌入式L i nux 的移植;并在L i nux 下开发针对芯片内部M M C /SD 控制器的设备驱动,实现对M M C /SD 卡的操作O 本研究都是基于已移植好L i nux 的S3C 2410A 平台,该平台的硬件架构,如图1所示O
图1 A MR 硬件平台框图
2 S D 卡接口电路
SD 卡各个引脚功能的定义,如表1所示O 数据线D A T 0~D A T 3在上电时作为输入,在设置完SE T _B U S_WI D T H 命令后作为数据线使用O 在上电后引脚1作为输入
O
表1 SD卡引脚定义
引脚M M C SD类型描述
1保留C D/D A T3I/O/P P卡检测位/数据线位3 2C M D C M D P P命令/响应
3V SSI V SSI S电源地
4V D D V D D S电源
5C L K C L K1时钟
6V SS2V SS2S电源地
7D A T0D A T0I/O/P P数据线位0
8N C D A T1I/O/P P数据线位1
9N C D A T2I/O/P P数据线位2 SD卡采用专用插槽接口S3C2410有专门的SD/M M C接口连接比较方便将S3C2410的SD接口线和SD卡对应的引脚连上即可在连线上特别针对数据线增加了上拉电阻以及0.1卜F的滤波电容接口原理图如图2所示
图2 S D卡接口原理图
3 L i n u x下设备驱动
3.1 L i n u x下#块$设备驱动
L i nux将设备分为最基本的两大类字符设备和块设备为提高效率系统对块设备的读写提供了缓存机制由于涉及缓冲区管理调度和同步等问题实现起来比字符设备复杂得多
L i nux为所有的文件包括设备文件提供了统一的接口操作函数本例系统平台采用2.4.18内核版本L i nux其操作函数接口定义如下1
s t r uc t f i I e_o pe r a t i o ns
s t r uc t m o duI e o w ne r
I o f f_t I I s e e k s t r uc t f i I e I o f f_t i nt
s s i z e_t r e a d s t r uc t f i I e c ha r s i z e_t I o f f_t
s s i z e_t w r i t e s t r uc t f i I e c o ns t c ha r s i z e_t I o f f_t uns i g ne d i nt po I I s t r uc t f i I e s t r uc t po I I_t a bI e_s t r uc t
i nt i o c t I s t r uc t i no de s t r uc t f i I e uns i g ne d i nt uns i g ne d I o ng
i nt o pe n s t r uc t i no de s t r uc t f i I e
i nt r e I e a s e s t r uc t i no de s t r uc t f i I e
...
结构体中的成员为一系列的接口函数如用于读/写的r e a d/w r i t e函数用于控制的i o c t I等打开一个文件就是调用这个文件f i I e_o pe r a t i o ns中的o pe n操作开发人员只需编写硬件相关的I/O操作就可以了
3.2 S D卡驱动具体实现
首先需要完成的是定义在嵌入式设备驱动开发中非常重要的头文件
1S3C2410中自带有SD卡控制器所以必须在程序中将这部分的头文件包含进来
#i nc I ude...
2确定设备名称主/次设备号和中断号确保将一个本系统中没有使用的主设备号分配给SD 卡驱动主设备号用来区分不同种类的设备而次设备号用来区分同一类型的多个设备在编写设备驱动程序的时候需要指明所操作设备的主设备号和次设备号本例采用了SD驱动主设备号234由于只有一个SD卡设备故次设备号0
#de f i ne M A J O R_N R 234
#de f i ne D E V I C E_N A M E SD
#de f i ne I R O_SD I R O_E I N T3
3一些基本的数据类型和宏定义
#de f i ne SD_C M D00x40 /G O_I D L E_ST A T E/
#de f i ne SD_C M D10x41/O C R R3SE N D_O P_C O N D/ #de f i ne SD_C M D20x42/A L L_SE N D_C I D/
#de f i ne SD_C M D30x43/SE T_R E L A T I V E_A D D R/
#de f i ne SD_C M D40x44/SE T_D SR/
#de f i ne SD_C M D70x47/SE E L E C T/D E SE L E C T C A R D/ 3.2.1 初始化函数
L i nux设备驱动需要编写初始化函数和清除函数分别将函数名加到m o duI e_i ni t和m o duI e_e x i t 中供驱动模块在加载和卸载时调用
m o duI e_i ni t i ni t_s d_di s k m o duI e_e x i t e x i t_s d_di s k
本研究将简要地介绍初始化函数i ni t_s d_di s k 的设计关键代码如下
s t a t i c i nt__i ni t i ni t_s d_di s k v o i d
i f de v f s_r e g i s t e r_bI kde v M A J O R_N R D E V I C E_N A M E
&s d_f o ps...
s d_g e ndi s k.f o ps=&s d_f o ps...
r e t=r e gue s t_i r g I R O_SD I s di_i nt e r r upt SA_I N T E R-R U P T"SD I"v o i d&s o I t...
bI k_i ni t_gue ue B L K_D E F A U L T_O U E U E M A J O R_N R
15
第10期刘源等基于嵌入式L i nux的M M C/SD
卡驱动开发
D E V I C E_R E O U E ST
a dd_g e ndi s k&s d_g e ndi s k
...
其中de v f s_r e g i s t e r_bI kde v用来注册设备r e gue s t_ i r g3用于申请中断该中断在SD卡读/写时产生的中断唤醒睡眠进程线程完成一次完整的SD 卡读/写操作bI k_i ni t_gue ue用来把D E V I C E_ R E O U E ST和队列相关联D E V I C E_R E O U E ST用来处理请求的处理函数是个宏定义#de f i neD E V I C E _R E O U E STdo_s d_r e gue s t do_s d_r e gue s t是队列请求的处理函数在do_s d_r e gue s t函数中调用do_s d _r w实现对s d卡的读/写在do_s d_r w中调用s d_do _t r a ns f e r_1bI k实现读/写一个块512字节在s d_ do_t r a ns f e r_1bI k中调用函数r e a d_da t a或w r i t e_da t a 函数读/写S3C2410A中的数据寄存器SD I D A T从而把数据写入SD卡SD卡块读/写流程图如图3所示SD卡块读/写时通过函数s e nd_c m d给SD 卡发送命令以实现SD卡各个状态间的转换其状态转换如图4所示
图3 S D卡块读/写流程图
图 S D卡读/写状态转换示意图3.2.2 块设备操作函数
在f i I e_o pe r a t i o ns结构体中由于使用了高速缓冲块设备驱动就不需要包含自己的r e a d w r i t e和f s y nc等函数但是必须要使用独立的o pe n r e I e a s e i o c t r I函数SD卡驱动程序的bI o c k_de v i c e_o pe r a-t i o ns定义如下
s t a t i c s t r uc t bI o c k_de v i c e_o pe r a t i o ns s d_f o ps
o w ne r T H I S_M O D U L E
o pe n s d_o pe n
r e I e a s e s d_r e I e a s e
i o c t I s d_i o c t I
其中i o c t r I函数被用于实现设备的专用控制功能
在本驱动程序中用来读取SD卡的分区信息
S D卡热拔插实现
为了实现SD卡的热拔插功能专门编写一个小驱动程序a ut o SD从图4中可以看出SD卡插座的一个引脚nC D连接到S3C2410A的E I N T3这个引脚在SD卡插入时为低电平而当SD卡拔出时为高电平与E I N T3相连实现中断为这个引脚编写一个驱动程序在驱动程序中编写中断服务子程序以用来处理SD卡拔插时引起的中断中断服务子程序定义如下
s e t_e x t e r na I_i r g de v i c e_SD de t e c t.i r g_no E X T_B O T H_E D G E S
G P I O_P U L L U P_E N
r e gue s t_i r g de v i c e_SD de t e c t.i r g_no SD de t e c t_i nt e r r upt SA_ I N T E R R U P T"SD de t e c t"N U L L
在驱动程序r e a d函数中调用了i nt e r r upt i bI e_ s I e e p_o n2函数以使进程进入睡眠状态在SD de t e c t _i nt e r r upt中断处理程序中调用w a ke_up_i nt e r r upt-i bI e2来唤醒进程在应用程序中编写守护进程调用s e I e c t函数以查询是否有SD卡中断到来当拔出或插入SD卡时中断唤醒睡眠进程s e I e c t调用返回
然后调用r e a d读取nSD_s t a t us线上电平如果是低则为插入SD卡运行脚本动态加载SD卡驱动如果是高则为拔出SD卡运行脚本卸载SD卡驱动在每次SD卡状态变化的同时需要相应地对SD卡进行m o unt和um o unt并及时地通知其他进程此时SD卡的状态守护进程的关键代码实现如下3
w hi I e1
s e I e c t r d+1&r ds N U L L N U L L N U L L
//查询是否有中断如果没
//有则阻塞有则返回
r e a d/de v/a ut o SD buf s i z e o f buf
//读取nSD_s t a t us线上状态
25机电工程第23卷
i f buf&0x01==0
s y s t e m./i ns m o d_SD//加载SD卡驱动模块
e I s e i
f buf&0x01==1
s y s t e m./r m m o d_SD//卸载SD卡驱动模块 ...
由此实现了SD卡驱动的自动加载和卸载无需人为干预在G U I图形界面上增加一个SD卡状态图标和卸载按钮能更有效地保证当每次所写的数据都完成之后再拔卡确保数据已经写入
至此完成了SD/M M C卡驱动程序的设计把驱动程序源文件放到/dr i v e r/bI o c k中并修改内核源代码/dr i v e r s/bI o c k/M a ke f i I e文件增加对SD卡驱动的编译代码重新编译内核就能实现对SD/ M M C卡的正确读/写操作了5 结束语
本研究所编写的SD卡驱动程序已经在嵌入式轴承检测系统中投入使用它完全支持热插拔功能实现了数据安全稳定的存放
参考文献!
[1] A L E SSA N D R OR J O N A T H A NC.L i nux设备驱动程序
[M].北京1中国电力出版社2002.
[2] K U R TW.G N U/L i nux编程指南[M].北京1清华大学
出版社2002.
[3]李玉波朱自强郭军.L i nux C编程[M].北京1清华
大学出版社2005.
[编辑!李辉]
&上接第46页’
本研究只从提高车辆行驶平顺性的角度对模糊控制器进行了设计对如何抑制轮胎动载荷与悬架动位移方面还有待进一步的研究
参考文献!
[1] G E L BA V A N D E R W E.M uI t i pI e-I nputD e s c r i bi ng
F unc t i o ns a nd N o nI i ne a rSy s t e m D e s i g n[M].M c
G r a w
H i I I1968141-109.[2] M I C H E L B E R G E RP P A L K O V I C S L B O K O R J.R o-
bus t de s i g n o f a c t i v e s us pe ns i o n s y s t e m[J].I nt e r na t i o na I
J o ur na I o f V e hi c I e D e s i g n1993142-31145-165.
[3]檀润华陈鹰路甬祥.路面对汽车激励的时域模型
建立及计算机仿真[J].中国公路学报19981131
96-101.
[4]余志生.汽车理论1第3版[M].北京1机械工业出版
社2000.
[编辑!罗向阳]
宁波长城精工实业有限公司打造中国五金工具第一品牌
在巴基斯坦尼泊尔中东等国家和地区如果你去逛五金店就一定能见到宁波长城精工实业有限公司生产的长城牌产品在这里长城牌已成为主流品牌据悉长城精工在抓好国内市场的同时不断拓展国际市场产品在西欧东欧中东南美非州和东南亚等50多个国家和地区已极具知名度和美誉度目前该公司自有品牌的出口额已占公司销售总额的30%以上
在公司创立初期长城精工就确立五高准则即引进高精设备高新技术高级人才制定高标准生产高品质产品每年他们都花大量精力和财力跟踪行业内最前沿的技术动态保持企业技术不断更新和提升并投入巨资引进印涂感光工艺精加工流水线和热处理设备等国际先进的工艺及设备采用国际先进标准作为企业生产的内控标准并引进高精度检测设备还与中国计量学院电子研究所合作开发了光电精度检测设备该公司的产品因此相继通过了欧共体E E C认证和英国度量衡局量具E E C认证
在近年来的五金市场上有一个有趣的现象就是国外的著名五金品牌要进入中国某个市场必先看看长城牌在这个市场上的动静后再做决定长城精工董事长朱文江说这是长城精工坚持打造自有品牌形成的效应据介绍早在1995年长城精工就导入了C I形象设计这一国际先进理念使品牌建设形成了一个完整的体系在产品方面该公司走多元化路子发展以长城牌为主系列环洋牌为辅系列的钢卷尺在营销方面他们建立起直接面向客户的网络密集型分公司把销售触角伸向国内的角角落落同时参与国际五金展销会使长城牌产品广为国内外消费者知晓并认可
35
第10期刘源等1基于嵌入式L i nux的M M C/SD卡驱动开发
基于嵌入式Linux的MMC/SD卡驱动开发
作者:刘源, 朱善安, LIU Yuan, ZHU Shan-an
作者单位:浙江大学,电气工程学院,浙江,杭州,3100027
刊名:
机电工程
英文刊名:MECHANICAL & ELECTRICAL ENGINEERING MAGAZINE
年,卷(期):2006,23(11)
被引用次数:4次
参考文献(3条)
1.李玉波;朱自强;郭军Linux C编程 2005
2.WALL K;WATSON M;WHITIS M;王勇GNU/Linux编程指南 2002
3.Jonathan Corbet;Alessandro Rubin;Greg Kroab-Hartman;魏永明 耿岳 钟书毅Linux设备驱动程序 2002引证文献(4条)
1.一种具有无线接入功能的动态参数测试仪[期刊论文]-电测与仪表 2009(9)
2.於琪建.张海峰Linux输入子系统在触摸屏驱动上的实现[期刊论文]-机电工程 2009(3)
3.李锦.吕柏权基于AT91RM9200的SD卡主控制器的设计[期刊论文]-微计算机应用 2009(1)
4.王炉意.陈宗农基于LPC2214的织机控制系统中SD主控制器的设计[期刊论文]-纺织学报 2008(9)
本文链接:https://www.wendangku.net/doc/d09320357.html,/Periodical_jdgc200611018.aspx