嵌入式Linux中断设备驱动程序设计_第1页
嵌入式Linux中断设备驱动程序设计_第2页
嵌入式Linux中断设备驱动程序设计_第3页
嵌入式Linux中断设备驱动程序设计_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5期兰晓红:嵌入式Linux中断设备驱动程序设计 # Linux兰晓红(重庆师范学院.重庆400047):中断管理是嵌入式操作系统的核心任务之一在设备驱动程序中使用好中断是提髙应用程序效 率的关健。详细介绍了 uClinux下设备駆动程序及其中断处理程序的开发方法和技巧.并实例介绍了一个 MP3播放器的中断服务程序开发方法。:中断;驱动程序;嵌入式系统;uOinux:1P393: A: 1001-3695 (2003) 05-0096-03Hie Design of Interrupt Device Driver in Embedded Linux Operating SystemLAN X

2、iarhDng(Chon肿ng Normal Uiuwnity .400(X17. China)Abstract: hlcmt Nhnagcnient is one of the core tasks in embedded operating systcm. In order to inprove application9 s efficiency .the key lechnology is how to make gxxi use of interrupt in device drivers. Ibis piper introduces the developing nthods and

3、 technDfogies of device drivers and intcrrqpt service piugrain in uGiniix At the same time .The author cxanplcs a device driwr of MP3 player.Key wirds : Irtempt: Driver Rugram; Biibedded System: uGinux第5期兰晓红:嵌入式Linux中断设备驱动程序设计 # 第5期兰晓红:嵌入式Linux中断设备驱动程序设计 # 1随着微电于技术的发展.以结构小巧、价格低廉且 极低功耗的微处理器构成的各种嵌入式系统

4、得到了广 泛的应用相应地也涌现出了一些商用化的嵌入式操作 系统,比较菩名的有Vxvuvk pSOS ,Neculeim 和 Windows CE等但其髙昂的价格.封闭的源代码以及产品版税等 限制了普及和广泛应用。嵌入式Linux操作系统以其低 廉价格、开放的源代码广泛的处理器支持.并且功能强 大易于移植而正在被广泛采用。嵌入式Linux系统的软件开发涉及的内容较多.如 网络、实时多任务.GUI系统、文件系统等.有些还与具体 硬件相关。本文就嵌入式Linux操作系统下.设备驱动 及中断服务程序的开发阐述相关技术及设计方法。2操作系统的作用之一就是向用户掩盖系统硬件的 特殊性使应用程序的开发与底层

5、的具体物理设备无 关设备驱动程序就是连接应用程序与具体硬件的桥 梁。Linux支持三类硬件设备:字符、块和网络.其驱动程 序编写方法基本相同这里介绍字符驱动设备程序的谏 计。Linux的一个基本特点是它抽象了对硬件设备的管:20()2-05-07 : 2002-()9-03理。所有的硬件设备都像普通文件一样看待它们使用 与操作文件相同的标准系统调用来进行打开、关闭和读 写。系统中的每一个设备都用一个特殊设备文件来表 示.如 np3drver ,c ,28 ,0 等。2. 1file - operations应用程序只有通过对设备文件的 open .close .read/ write Jocl

6、l等才能访问硬件设备.Limix的扩展文件操作 结构file - operations实现了标准的文件操作到硬件设备 操作的映射每个设备驱动程序都要实现这个接口所定 义的部分或全部函数。file _operations定义如下:struct file . operationsin:(*lseek)(sinict irxxie* struct file * oft _t. ini):in:(*read)(stmet inxJe* Qruct file * char * int):ini(*urite)(strwt imdc* struct file const char * . im):im (

7、 * readdir) (stmet im)& struct file * void .filldir .1): in:(* select)(struct inxle* , struct file . int . select - table*);in:(* ioctl)(strnct inode* , struct file * unsigned int. unsgnedlong):im ( *ninap) (struct imde * <aract file * struct vm _ area _ Qruct *);im ( *open» (struct inod

8、e * struct flic );uid ( * release) (struct inode * . struct file *):in:(fsync) (stnrt inode * . struct Ale *):in: ( *fasync) (struct inode * , strucl file * int):im ( * check . nrdia . change) (kdev . t dev):im ( * revalidate) (kdev .( dev):;在这些函数指针中-open .release用于设备的打开和 关闭是每个驱动程序都要实现的函数。其它函数根据 实际设

9、备的作用不同而实现相应的函数没有实现的函第5期兰晓红:嵌入式Linux中断设备驱动程序设计 97 第5期兰晓红:嵌入式Linux中断设备驱动程序设计 # © J995-2004 Tsinghua Tongfang Optical Disc Co.t Ltd. All rights reserved.第5期兰晓红:嵌入式Linux中断设备驱动程序设计 # 数指针应该设为NLLL。例如.一个I2C总线的驱动程序的扩展文件操作结 构可如下:druct file - opcraions I2C - fops =NULL.DC-read.DC _ wile.NLLL,NILE.EC_ ioct

10、l NLLL.EC open DC _ releatf,I;该结构中最后一个函数后面的空指针省略了。这 里I2C_read用于I2C总线读.I2C_wrile用于I2C总线.EC .open用干打开I2C总线駆动程序,I2C _ release 用干关闭I2C总线驱动程序.EC.ioctl用干与驱动程序 交换控制倍息其它未用的设亶为NULL。2. 2file - operations根据具体设备驱动程序的需要分别实现file.open aliens所用到的每个函数.就完成了驱动程序的大部分 工作。这里要注意的是每个函数的參数个数与类型必 须和file -operations中要求的一致。2.3

11、实现了 file .operations中所需函数后还要编写一个 该驱动程序初始化函数.在内核启动时登记这个驱动程 序。例如初始化这个I2C驱动程序.可如下:void Init - OC_bus()(int result:result = regier - chrdcv(38 . -I2Cbus" , &I2C -:if (result <0)printk(ffInit _ I2C_ bus () om'l get Nhjor %d n unbus_ nupr): 函数register . chrdev是设备驱动程序登记函数原 型如下:int register

12、. chrdev (unsipied int major .const char * name ,struct file - operations:参数major为主设备号.内核中一个驱动程序对应 一个主设备号.不重复就可以。Linux版本不同这个值 的最大取值也不同.2.0以前为64.2.0.6到2. I. II为 128 .主设备号还可以动态分配。一个驱动程序可以管 理几个设备可以用一个字节长的次设备号来区分。驱 动程序名、驱动程序类别、主设备号、次设备号按一定的 格式就组成了/dev目录下的设备驱动文件名。參数name是驱动程序名.设备名称。参数fops就是前面实现的扩展文件操作结构指针

13、。返回值小于0表示失败.大干等于0表示成功。根据这个函数的參数还要在/dev目录下创建该设 备文件名: OCbus . c . 38.0 © 可用命令 mknod / dev/ I26usc 38 0创建或者拷贝一个巳有的设备文件修改 得到。为了让内核启动时调用这个初始化程序.在/linux/drivers/ char/ mem. c 中的 chr _ dev _ init ()函数中 加入对 初始化程序的调用.当然要在调用前加入该函数声明。至此为止驱动程序就完成了 .当然这个驱动程序 还不能使用中断。3耍在设备驱动程序中使用中断只有两步工作要 做:第一、在初始化函数中的regist

14、er _ clirdev ()调用之 后使用request _ irq()函数安装中断处理程序。request _ irq()函数声明如下:in: request . irq(unsigned int lrq void ( lundler) (int void * struct pt -regs ) unsigned long flags .const chai * device void dev . id);其中的参数irq驱动程序使用的是中断号;handler 是中断服务函数指针:伽gs是一个与中断管理有关的各 种选顶的字节掩码:device proc/ interrupts中用于显示 中

15、断的拥有者:dev _id 个指针用于共享的中断信号 线:返回0成功非0失败。上面I2C总线驱动程序可如下安装一个中断处理程 序:vc = request - irq(25 12C - isr IRQ - SID. *DCbus*. NULL): ii' (rc) piimkCirq ixM registered. Enur: %d n", rc):第二、实现这个中断服务程序.参数必须与request . irqO登记时要求的一致且不能有返回值。4駆动程序可以按照两种方式编译一种是静态编译 进内核另一种是编译成模块以供动态加载。由于ir Oinux不支持模块动态加载,而且嵌入

16、式Linux不能够像 桌面Linux那样灵活的使用insiwd/ mmod加栽卸栽i殳备 驱动程序因而这里只能将设备驱动程序静态编译进U- Oinux内核.步骤如下:将编写好的驱动程序文件复制到/ uclinux/linux/ drivers/elm目录下。因为所有的字符设备驱动程序都在 该目录下编译。(2)修改/ uelinux/ linux/ drivers/ char 目录下 Makefile , 使内核编译时编译这个驱动程序。假设驱动程序文件 名为 I2Cbus. c .在 Makefile 中增加这一行:L-OBJS + = 12Cbus.o5在应用程序中使用设备驱动程序与使用普通文

17、件 一样先打开它之后可以用zd/wile读写设备用完之 后应将它关闭。6 MP3由于Linux系统源代码的开放性.无论是编写设备 驱动程序或应用程序,都可以找到一个相似的程序作 为你的程序的基础不用从头编写。第5期兰晓红:嵌入式Linux中断设备驱动程序设计 # 第5期兰晓红:嵌入式Linux中断设备驱动程序设计 # © 1995-2004 Tsingliua Tongfang Optical Disc Co. Ltd. All rights reserved.第5期兰晓红:嵌入式Linux中断设备驱动程序设计 99 MP3音乐播放具有较强的实时性控制器必须及时 地给MP3解码芯片提

18、供数据.否则.音乐就会有断续感 实例中处理器用MCF53O7 .MP3文件存于SMC卡上.MP3 解码器用S1A013, SIAO13的数据请求线连接CPU的 IRQ7。驱动程序MP3driwr. c如下:/驱功帶要的头文件# include < linux/ coifig. h ># include < linux/ types, h ># include < linux/ kernel. h ># include < linux/fs. h ># include < linux/ mm. h ># include < lin

19、ux/ delay, h ># include < linux/ uwt. h ># include < asnV param h >/与处理器相关的头文件# include < asn/coldfire h ># include <asn/indzm. h> # include <asnVirq. h>/定义存储卡页大小.qm每次从SMC卡上懊一页# define SMC. PAGE 528/定义主设缶号为丸次设缶号为0# define MP3-MAJOR 38/ uGinux 中®I向益 31 对应 CPU 的 I

20、RQ7# define MP3 _ IRQ 31 / 1RQ7void SnrReidRie (): 从 SMC 卡懊一页void G)to&>ng(short no) : / 跳到任恵一首歌播放void SendOutDutaO : /向STA013串行发送一字节数据H用干打开殳缶int np3 _open(jtnvt iaxle *ioxle struct file *filp)pnntk(*np3 «open() n"): re<um(0):/用于关闭设缶void mp3 _ release (struct iixmIc #inLxlc struc

21、t file #fiip)pnntk(*np3 _ close () n*):n用干向驱动程序发送控制命令int np3 _ kxil (struct inxic imde struct file *filp unsigned int end unsigned long arg)int rc = 0;switch (cnid)case MP3 .SET.OJRSONG:GjiuNeuSai (< sturt) arg):break:case MP3.STOP:brvak:case MP. ILAY:break: default: rc = - EINVAL;break;Irv<ur

22、n(rc);/中眇服务程序伪代码void mp3_isr(im irq md *dev. id stnict p< .regs *regs)SnvReadRiflcO : /渎取一页新数据 wluleiNt)3RequireDlita() /向解码器发送數据直到解码 器不请求为止SendOutDiitaO ;)/设缶的扩展文件操作结构gruel file - operutions np3 - tbps =(NILL./ # Iseck /NLLL* read /MILL / write */NILL / readdir /NULL J poll /叩3 . ioctl . / * ioc

23、tl */NLLL / */np3 _open./ * open Tnp3 - release . / * release */NLLL . / fsync /NLLL J fasjTC /NLLL / * check - nvdia - change */MILL / revulidate /;/呃动程序的初始化函数void np3 _ iiut( wid)int rc:tf (rv = ivgicr cludev (MP3 . MAJORnp3im" &】p3 . fops) < 0)pnntk( KERN . WARNING : can'l get nxyor 掘d n" .MP3 - MAJOR):return:Irc = request - irq (MP3 - IRQ. np3 一 isr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论