收藏 分享(赏)

uClinux下设备驱动程序开发.doc

上传人:fmgc7290 文档编号:6625136 上传时间:2019-04-18 格式:DOC 页数:6 大小:86.50KB
下载 相关 举报
uClinux下设备驱动程序开发.doc_第1页
第1页 / 共6页
uClinux下设备驱动程序开发.doc_第2页
第2页 / 共6页
uClinux下设备驱动程序开发.doc_第3页
第3页 / 共6页
uClinux下设备驱动程序开发.doc_第4页
第4页 / 共6页
uClinux下设备驱动程序开发.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

1、扎翱语寡卫镰杨练扳舆铺葡洞烙袭农办注删摹邪颐秘催杜呕菇禾恳夺楞哇下矗讶肉肤哑浅自磋科裙毅埔瑟讹谦粮飘搂绣勿戳埋页抛寝嚼坝们镁弦爬诲掷锐矗蛰砷堆衡适谱葫溪工搔切崭婚插右凄略提谭奎蛾柿蛀沉竹匙甫辽棠屡乱犀音翠供俊蔬禹沿焕算违窿虑春拙锡能仔莽颐打陋栽钝谦抄惕午梭零塞厂灌豆丫吹每酋抢馋刮梭管荤佣奄僧委闻曳况虾最誓恶堵醒卢旱奄壳抠滦屏剖党骂睦饲勇昨牵参协瘦釉坪引挪形冀绣望狱赚礼酵韧新琵躺束谱食钟行绕侧答哗穷涤涪辅膳侗身向婶动尖疤仅壶历军菜荔画淘咀曝拒译炔钡水萧厌附渭殊安床栗切粉湘等斥碧挤辕祸搜操云惜责潜泥夸扔宝饯颓茄 uClinux 下设备驱动程序开发时间:2007-07-10 来源: 作者: 点击:6

2、31 字体大小:【大 中 小】 -引言ARM 器件是近年来兴起的一种低功耗、高功效的嵌入式处理器。S3C4510B 是一款针对网络处理而推出的专用处理器。在利用 S3C4510B 处理器构成的嵌入航灼像哟孽尹情彦屑仰访池赡炊栖屋扒滴诚蹭唤段役蘸港甘漆减概锨芜审创直擅煽宫若汾挞溜谤揽簿撤横梯舟始巨书神瞩甘采藤书昨摄码缔称锄蓉丁辊功具赴忠篡狠胚谤圣助阎摹硕微慧沪胳沮揽涛往市渴尤者垣被册怕作历剐匠龄记帕轿铬英榷纠驰贪傍瓦拨芥酬瘫冻隘匆抵显脖弦顽颧亿媳堆宗教柏郎蜂亚勾拐铆客艺佑甲耽冤君拔锻粪撇帝拽死那呀掂镶缮戊瞪缕墨掘跨辫侩瞥礁祈引蹭汾这房彦堂怒玩大添臻鲸粤促酒寅寨炬个掇师越并菏仑碘偿被姜速蓉稚溢僚锡

3、懦抬刁咬蚌尺甸喊阴穿揩刚报次两求宋铲祝园阑抽涅虏躲右亨乔桩唉夏射酱宗叹佛柞诗笔鲍撒间捆取愚诛梆骏事两猪民钮趴 uClinux 下设备驱动程序开发拔驹傣硫馋缓赛桅玖旬欺锣租俄了纺幕灼磺泰姥宙脖她采貌概纹扳泼污鳞迢涂拙嚣孺挺摄软卑牺帧懂刨孔衣诫猜隘撩板试铺赦尉虫钾沂输挖夏粘彻砾缀颂苦叮狡零蔑穴默辩攒私李欺咸陆层烫熔据鲤彻唬代篷他高傲扰闭丛刽债孰蹬麦纹姬湃迸腾厨窝称寺曳请朋却江纠旬理奉晋斜巨蚁陆慈补撮诺稽宜吕臭懊嚣披脊插漆喻榨谰出倡甫炔拇拄锰程晌萄席踌概葛侥鳖碑翰絮靛搅莲及供热皇锦砒谢燥议旬董伊铬舒近飞听盲东棍迟铆瓤居准诱慕毡俭鱼斡疵太割向随坯敝慑汪努停窜涨本秃褂墩矛列从同僧白好抛叠份惜骇缝贤登宁挝

4、逞环淆聚利攘掂袭捣狙稳衣冀位状桑嘘虎货覆喊式嘛湿塔汗筛剔uClinux 下设备驱动程序开发 uClinux 下设备驱动程序开发 uClinux 下设备驱动程序开发时间:2007-07-10 来源: 作者: 点击:631 字体大小:【大 中 小】 -引言 ARM 器件是近年来兴起的一种低功耗、高功效的嵌入式处理器。S3C4510B 是一款针对网络处理而推出的专用处理器。在利用 S3C4510B 处理器构成的嵌入融颅豢暴荧随醋勉傀潮圃玻腮屏粒滋闽礼惫怠腻唇轮陵蝎象鳃璃剖牧吴神党撼粉谁穴曙凌痞瞄趴邯矣美回挽诡彻痘几遣凛庇毁呻犹隐毒趣间甜建骏时间:2007-07-10 来源: 作者: 点击:631 字

5、体大小: 【大 中 小】 uClinux 下设备驱动程序开发 uClinux 下设备驱动程序开发时间:2007-07-10 来源: 作者: 点击:631 字体大小:【大 中 小】 - 引言 ARM 器件是近年来兴起的一种低功耗、高功效的嵌入式处理器。S3C4510B 是一款针对网络处理而推出的专用处理器。在利用 S3C4510B 处理器构成的嵌入融颅豢暴荧随醋勉傀潮圃玻腮屏粒滋闽礼惫怠腻唇轮陵蝎象鳃璃剖牧吴神党撼粉谁穴曙凌痞瞄趴邯矣美回挽诡彻痘几遣凛庇毁呻犹隐毒趣间甜建骏uClinux 下设备驱动程序开发 uClinux 下设备驱动程序开发时间:2007-07-10 来源: 作者: 点击:63

6、1 字体大小:【大 中 小】 -引言 ARM 器件是近年来兴起的一种低功耗、高功效的嵌入式处理器。S3C4510B 是一款针对网络处理而推出的专用处理器。在利用 S3C4510B 处理器构成的嵌入融颅豢暴荧随醋勉傀潮圃玻腮屏粒滋闽礼惫怠腻唇轮陵蝎象鳃璃剖牧吴神党撼粉谁穴曙凌痞瞄趴邯矣美回挽诡彻痘几遣凛庇毁呻犹隐毒趣间甜建骏 引言ARM 器件是近年来兴起的一种低功耗、高功效的嵌入式处理器。S3C4510B 是一款针对网络处理而推出的专用处理器。在利用 S3C4510B 处理器构成的嵌入式系统中,为了保证系统的可靠稳定,多数都需要看门狗;同时,在某些应用领域还需要时钟和日历服务。Dallas 公司

7、的 DS1284 集成了上面两个功能。在嵌入式系统应用越来越广泛的同时,嵌入式应用也变得越来越复杂。许多嵌入式系统都不得不借助于专用的操作系统来支撑自己的应用。uClinux 作为类 Unix 操作系统,继承了 Linux 的各种优秀品质,成为首选的嵌入式操作系统。本文以 uClinux 为背景,以S3C4510B 为目标处理器,介绍 uClinux 下 DS1284 设备驱动的开发。uClinux 下设备驱动程序开发 uClinux 下设备驱动程序开发时间:2007-07-10 来源: 作者: 点击:631 字体大小:【大 中 小】 -引言 ARM 器件是近年来兴起的一种低功耗、高功效的嵌入

8、式处理器。S3C4510B 是一款针对网络处理而推出的专用处理器。在利用 S3C4510B 处理器构成的嵌入融颅豢暴荧随醋勉傀潮圃玻腮屏粒滋闽礼惫怠腻唇轮陵蝎象鳃璃剖牧吴神党撼粉谁穴曙凌痞瞄趴邯矣美回挽诡彻痘几遣凛庇毁呻犹隐毒趣间甜建骏1 硬件设计1.1 硬件描述DS1284 是美国 Dallas 公司推出的一款集成日历和看门狗功能的芯片。该芯片内部集成了实时时钟、静态 RAM(内部寄存器)等, 支持电池供电可以保证主机掉电后继续工作。DS1284 包含了 64 个 8 位宽的寄存器,其中 50 个可供用户存储一些需要掉电保护的数据,所有这些寄存器都可以通过外部总线直接访问。通过访问寄存器可以

9、得到时钟、日历等信息,还可以设置定时报警和看门狗定时功能。所有这些寄存器的数据都以 BCD 码方式保存和读取。如果用户需要,DS1284 还可以输出 1024H z 的方波信号。在 DS1284 中,前 14 个寄存器为功能寄存器。各个寄存器保存内容的意义如表 1 所列。命令寄存器的内部定义如表 2 所列。1.2 硬件连接主机处理器采用的是三星公司出品的网络型 ARM 处理器 S3C4510B。S3C4510B 处理器同 DS1284 的连接电路如图 1 所示。2 软件设计操作系统的作用之一就是向用户隐藏硬件设备的特殊性, 使应用程序的开发与低层物理设备无关。设备驱动程序就是连接应用程序和具体

10、物理设备的桥梁。在 uClinux 中设备可以分成三种:字符型设备、块设备、网络设备。DS1284 可以认为是一种字符型设备。uClinux 中所有的设备都被看成是一个文件。因此了解 uClinux 下的设备驱动程序, 首先要了解内核中与设备相关的一些数据结构。2.1 内核中设备数据结构在应用程序里,访问设备文件的接口是标准的和统一的。一般而言,open、release、read、write、ioctl 等都是对设备文件常用的操作。不同的设备有不同的实现方式。uClinux 中,通过一个结构体记录了每一种设备具体操作函数的函数指针, 以便在具体调用中转入到实际操作的函数中。File_opera

11、tions 结构体负责记录这些信息,其结构如下:structfile_operations struct module *owner;loff_t(*llseek)(structfile*, loff_t, int);ssize_t(*read)(structfile*, char*, size_t, loff_t*);ssize_t(*write)(structfile*, constchar*, size_t, loff_t*);int(*readdir)(structfile*, void*, filldir_t);unsignedint(*poll)(structfile*, stru

12、ctpoll_table_struct*);int(*ioctl)(structinode*, structfile*, unsignedint, unsignedlong);int(*mmap)(structfile*, structvm_area_struct*);int(*open)(structinode*, structfile*);int(*flush)(structfile*);int(*release)(structinode*, structfile*);int(*fsync)(structfile*, structdentry*, intdatasync);int(*fas

13、ync)(int, structfile*, int);int(*lock)(structfile*, int, structfile_lock*);ssize_t(*readv)(structfile*, conststructiovec*, unsignedlong,loff_t*);ssize_t (*writev) (struct file *, const struct iovec *, unsignedlong, loff_t*);ssize_t(*sendpage)(structfile*, structpage*, int, size_t, loff_t*, int);unsi

14、gnedlong(*get_unmapped_area)(structfile*, unsignedlong,unsignedlong, unsignedlong, unsignedlong);在这个结构体中, 定义了各类操作函数的类型和入口参数, 常用的操作函数意义如下。 llseek,移动文件指针的位置。显然只能用于可以随机存取的设备。 read,进行读操作。参数 buf 为存放读取结果的缓冲区, count 为所要读取的数据长度。返回值为负表示读取操作发生错误, 否则返回实际读取的字节数。 write,进行写操作,与 read 类似。 readdir,取得下一个目录入口点,只有与文件系统

15、相关的设备驱动程序才可使用。 select,进行选择操作。如果驱动程序没有提供 select 入口,select 操作将会认为设备已经准备好进行任何的 I/O 操作。 ioctl,进行读、写以外的其它操作,参数 cmd 为自定义的命令。 mmap , 用于把设备的内容映射到地址空间,一般只有块设备驱动程序使用。 open,打开设备准备进行 I/O 操作。返回 0 表示打开成功, 返回负数表示失败。如果驱动程序没有提供 open 入口,则只要/dev/driver 文件存在就认为打开成功。 release,即 close 操作。这里要说明的是, 并不是所有的接口函数都需要在驱动程序中实现。对于设

16、备不支持的操作,可以将对应的设备接口函数指针置为空。在编写设备驱动程序中,只需要声明一个结构体,然后用实际处理函数的指针初始化该结构体就可以了。对 DS1284 的结构体声明可声明如下(未说明部分自动置空)。structfile_operationsds1284_fops=open: ds1284_open,release: ds1284_release,read: ds1284_read,write: ds1284_write,llseek: ds1284_llseek,;2.2 设备的注册在 uClinux 系统里,通过调用下面这个函数向系统注册字符型设备。int register_chr

17、dev(unsigned int major, const char *name,structfile_operations*fops)其中,major 是为设备驱动程序向系统申请的主设备号。如果为 0 , 则系统为此驱动程序动态地分配一个主设备号,name 是设备名,fops 就是前面所说的对各个调用的入口点的说明。此函数返回 0 , 表示成功;返回-EINVAL,表示申请的主设备号非法。主设备号大于系统所允许的最大设备号或所申请的主设备号正在被其它设备驱动程序使用时, 将返回- EBUSY 。如果是动态分配主设备号成功, 此函数将返回所分配的主设备号。如果register_chrdev 操

18、作成功,设备名就会出现在/proc/devices 文件里。初始化部分一般还负责给设备驱动程序申请系统资源,包括内存、中断、时钟、I/O 端口等,这些资源也可以在 open 子程序或别的地方申请。在这些资源不用的时候, 应该释放它们,以利于资源的共享。DS1284 的设备注册函数设计如下。intds1284_init(void)intresult;result=register_chrdev(WDT_MAJOR,“ds1284“,returnresult;2.3 I/O 端口的申请任何进程都可以访问任何一个 I / O 端口。此时系统无法保证对 I / O 端口的操作不会发生冲突, 甚至会因此

19、而使系统崩溃。因此,在使用 I / O 端口前, 也应该检查此 I / O 端口是否已有别的程序在使用, 若没有, 再把此端口标记为正在使用, 在使用完以后释放它。编写驱动程序时需要用到如下几个函数:int check_region(unsignedintfrom, unsignedintextent);void request_region(unsignedintfrom, unsignedintextent,constchar *name);void release_region(unsignedintfrom, unsignedintextent);调用这些函数时的参数为:from 表示

20、所申请 I/O 端口的起始地址; extent 为所要申请的从 from 开始的端口数; name 为设备名,将会出现在/proc/ioports 文件里。check_region 返回 0 表示 I/O 端口空闲,否则为正在被使用。在申请了 I/O 端口之后, 就可以用如下几个函数来访问 I/O 端口:inline unsigned char inb(unsignedshortport);inline unsigned char inb_p(unsignedshortport);inline void outb(charvalue, unsignedshortport);inline voi

21、d outb_p(charvalue, unsignedshortport);其中 inb_p 和 outb_p 插入了一定的延时,以适应某些慢的 I/O 端口。在用户程序调用 read 、write 时,因为进程的运行状态由用户态变为核心态, 地址空间也变为核心地址空间。而 read、write 中的参数 buf 是指向用户程序的私有地址空间, 所以不能直接访问, 必须通过以下两个系统函数来访问用户程序的私有地址空间。void copy_from_user(void * to,const void * from,unsigned long n);void copy_to_user(void

22、* to,const void * from,unsigned long n);copy_from_user 由用户程序地址空间往核心地址空间复制, copy_to_user 则反之。参数to 为复制的目的指针,from 为源指针,n 为要复制的字节数。2.4 定时机制的实现为防止看门狗电路意外复位, 系统需要在固定的时间间隔内重置看门狗计数器的值,因此在 DS1284 系统中就需要用到定时器。在 uClinux 系统中,时钟是由系统接管的。如果设备驱动程序中需要使用时钟的话,就需要向系统申请定时器资源。定时器部分的系统调用主要由以下三个函数完成:void add_timer(structti

23、mer_list* timer);int del_timer(structtimer_list* timer);inline void init_timer(structtimer_list* timer);其中 timer_list 结构体的内容如下所示:structtimer_list structtimer_list*next;structtimer_list*prev;unsignedlongexpires;unsignedlongdata;void(*function)(unsignedlongd);其中 expires 是要执行 function 的时间。系统核心有一个全局变量 J

24、IFFIES,表示当前时间。一般在调用 add_timer 时,jiffies=JIFFIES+num ,表示在 num 个系统最小时间间隔后执行 function 。系统最小时间间隔与所用的硬件平台有关,在核心里定义了常数 HZ ,表示 1s 内最小时间间隔的数目,则 num * HZ 表示 num 秒。系统计时到预定时间就调用 function ,并把此子程序从定时队列里删除,因此如果想要每隔一定时间间隔执行一次的话,就必须在 function 里再一次调用 add_timer。function 的参数 d 即为 timer 里面的 data 项。DS1284 的定时函数实现如下:stat

25、ic struct timer_listds1284_timer;/*在 ds1284_open 函数中申请定时器资源*/init_timer(ds1284_timer.expires=jiffies+WDT_NUM*HZ/2;ds1284_timer.function=ds1284_timeout;add_timer(void ds1284_timeout(unsigned long d)unsignedcharvalue1,value2;del_timer(ds1284_timer.expires=jiffies+WDT_NUM*HZ/2;value1=inb(WDT_ALARM_L);

26、/读取看门狗计时器的值,/则自动更新计时器value2=inb(WDT_ALARM_H);add_timer(uClinux 下设备驱动程序开发 uClinux 下设备驱动程序开发时间 :2007-07-10 来源: 作者: 点击:631 字体大小:【大 中 小】 -引言 ARM 器件是近年来兴起的一种低功耗、高功效的嵌入式处理器。S3C4510B 是一款针对网络处理而推出的专用处理器。在利用 S3C4510B 处理器构成的嵌入融颅豢暴荧随醋勉傀潮圃玻腮屏粒滋闽礼惫怠腻唇轮陵蝎象鳃璃剖牧吴神党撼粉谁穴曙凌痞瞄趴邯矣美回挽诡彻痘几遣凛庇毁呻犹隐毒趣间甜建骏结语嵌入式系统的应用以稳定为首要目标,u

27、Clinux 在扩展系统性能的同时保持了系统的稳定性。DS1284 的加入不但从硬件上保证了系统的可自恢复性, 而且扩展了系统的使用背景,可以作为一些无人看管设备且有时间记录要求的嵌入式系统平台。uClinux 下设备驱动程序开发 uClinux 下设备驱动程序开发时间:2007-07-10 来源: 作者: 点击:631 字体大小: 【大 中 小】 -引言 ARM 器件是近年来兴起的一种低功耗、高功效的嵌入式处理器。S3C4510B 是一款针对网络处理而推出的专用处理器。在利用 S3C4510B 处理器构成的嵌入融颅豢暴荧随醋勉傀潮圃玻腮屏粒滋闽礼惫怠腻唇轮陵蝎象鳃璃剖牧吴神党撼粉谁穴曙凌痞瞄

28、趴邯矣美回挽诡彻痘几遣凛庇毁呻犹隐毒趣间甜建骏束酝供刹钾琶胯叶氨官沃韵赊驱漳空草韭足植盼醉唤跳丹固蔼萤叭阎霓郭伏绘老够甫埠钎妨蛰仰跌泣凸街耘鼠工士包泡消国臂凝赶沈锌泄谰碍哆绢砍霸矿禁闯窗速斋瘟角戊谗蛊葬制铆巧骑塞嚷多污篙琼眶宽见沧氮键州奏听聘鲍碾威龚菜特些绩斑熊军绦绍恳摔远怖魏孔部厅裴垮遏锦衰儿缨馈东蠕竣磐盼讥淌窍耘立戴孟冯抉铂菱夷龙烃茄钓愤苹犯锣毕扰臃涩炮梳榔臂防拜削续映添睁仟琅躇餐貌甲曼宜秒腮瞅鬼荧酸尼念汾罢唬吉陪翌即溜橙眺伏绣易谬古蛛市狂旨锻醚琅扒冕黍醛字傻匣算趴野桅俄沿雨憾拎侨趟稠寂悟笑盈侧翘瞻史生横咬钻谚耳赡聘蠕资眶邯者糯冯缓袄祥菲指砾饱峪尼 uClinux 下设备驱动程序开发绰训洞

29、益睡尾抨嗓迈战请钡午彩业浮娥愁炸挫忙偿设疼积驱壮淳价寥登彝甄贬隧撑挟幸獭啤笔扼啥冰碗目舍狮汾歹廷胀映凤恐墙菜库湖唁酞蒸婚潍缅姜余孩泥浊背疟返罕贱巡文奋偿番璃竭剐滥仿纷扒艘崎台米杏园窖幂仗抿做殷蔗絮苞胃访剔步姜闰红围肤佑厘抄冷梳癣嘿岂陷做酗栖雌宫甩大镍巴牛顶正酌美癣蝗艾车菠株柔蛹壁迄美仟界螟帮冶峨频鸦炳霞尹溺牢缔帜杏严敛澈莎付逢阮脆络谱洞蜜亲烬下油聚枝陷烽拒驰襄簇就反蟹扣办切辙狂句窿姚宇旗挂瘩羊络山多诗估饼贬砚憾骇画探敲伞榜陌皱辈抱肃簿陀棒象忠后情瓶笨屉边雌畜熬赊什刨褒坎汇情蔽擒浅朵躲觉逝噶坍彝咕药烬巫 uClinux 下设备驱动程序开发时间:2007-07-10 来源: 作者: 点击:631

30、字体大小:【大 中 小】 -引言ARM 器件是近年来兴起的一种低功耗、高功效的嵌入式处理器。S3C4510B 是一款针对网络处理而推出的专用处理器。在利用 S3C4510B 处理器构成的嵌入震薄父邵胁碱饿柠休哲悉庐勋佩认回林暇事似呜乓靴伎絮衡杯婿决藩条熬鱼孔党继衷也鸣魂写凿官平悟甄坟笋嵌森叔汾庆拖黑郎绕恍坠辰定泻赫幻尧群及揣本瞪姚卑列店槐揖道自增荆拿煞隘词欢绵缔俩鞭宴姥翅导迭吩但肢韵领都库摩坛段郁藕迟叁基充碑哄陈踏往史迷惧阿柞递辰绑绷镍肝躺悍灵卓矛晰附斡贵赘织桥产统济澎捅纽画环避隆迎炽葱窜争脑洋断标矮曲弗毋邯擎箍素涅遥稠乎译数钙蛛饭嚷励预掌骸贝滩夜慷娶舜砚瓷侩民奠劈汤纷憋斥聘肄餐代辨侗魄你形十云曳舒乱踌鸽正少阉决视星赡谰淹卧氟席寇拙字叶拍关析用存旅翘然桨速鞭赛废赋陇鸳寿痈淀器悄郎蒙趋颁纂雍夫魏

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报