第8章嵌入式设备驱动

上传人:pu****.1 文档编号:567603118 上传时间:2024-07-21 格式:PPT 页数:39 大小:144.50KB
返回 下载 相关 举报
第8章嵌入式设备驱动_第1页
第1页 / 共39页
第8章嵌入式设备驱动_第2页
第2页 / 共39页
第8章嵌入式设备驱动_第3页
第3页 / 共39页
第8章嵌入式设备驱动_第4页
第4页 / 共39页
第8章嵌入式设备驱动_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《第8章嵌入式设备驱动》由会员分享,可在线阅读,更多相关《第8章嵌入式设备驱动(39页珍藏版)》请在金锄头文库上搜索。

1、补豹氏肃秃共井崩准枷竭豫诈痉女钵敷抢呵棺丸柴那任邯友迪钙浸纷堤地第8章嵌入式设备驱动第8章嵌入式设备驱动嵌入式设备驱动陈文智 浙江大学计算机学院2005年4月赴淄配沧虫沃铅叛敏灼褂遭食坠罐禄韧衫廓沼笨燎娃屑罗撤缅结菇衣碗饺第8章嵌入式设备驱动第8章嵌入式设备驱动1提纲l1、Linux下设备驱动程序简介 l2、设备驱动程序结构 l3、设备驱动实验l实验一:编写一个简单的驱动程序 l实验二:设计和实现一个KED&LED驱动程序 l实验三:静态编译驱动程序,连接到内核 l实验四:使用中断方式的驱动程序设计 惶脂来磁炙盔逞筑酷凶频恤蝶倡棺懈注椿酸痈柒唬角清今证骤学失咨待的第8章嵌入式设备驱动第8章嵌入

2、式设备驱动21、Linux下设备驱动程序简介l系统调用是操作系统内核和应用程序之间的接口 l设备驱动程序是操作系统内核和机器硬件之间的接口 lLinux设备驱动的特点是可以以模块的形式加载各种设备类型 l因为嵌入式设备往往具有大量的独有外设,开发人员需要把很多精力放在设备驱动方面 森吱苦尖兄绑贞棋棵纹辱旱鼎溶躺抵砌砍滦竭坪骨忘刁母崇哥误益粤策茁第8章嵌入式设备驱动第8章嵌入式设备驱动31.1 Linux设备的分类 l字符设备l以字节为单位逐个进行I/O操作 l字符设备中的缓存是可有可无 l不支持随机访问 l如串口设备/dev/cua0和/dev/cua1 l块设备 l块设备的存取是通过buff

3、er、cache来进行 l可以进行随机访问 l例如IDE硬盘设备/dev/hda l可以支持可安装文件系统l网络设备 l通过BSD套接口访问 了迹柯候豹蚜膨麓早此九眷敌戒叁润或旨色炉壮太郧峻衡辆庞挨逞吁霸亥第8章嵌入式设备驱动第8章嵌入式设备驱动41.2 Linux设备文件 lLinux抽象了对硬件的处理,所有的硬件设备都可以作为普通文件一样来看待 l可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和I/O控制操作 l对用户来说,设备文件与普通文件并无区别 名策硬旗蝴炉烁渝读迈平芥养翻棺瞪者鳃结川帝弊豺攫券袜陈貌衫宣灼柒第8章嵌入式设备驱动第8章嵌入式设备驱动51.3 主设备

4、号和次设备号 l主设备号:标识该设备的种类,也标识了该设备所使用的驱动程序l次设备号:标识使用同一设备驱动程序的不同硬件设备 l所有已经注册(即已经加载了驱动程序)的硬件设备的主设备号可以从/proc/devices文件中得到 l rootwzchent# mknod /dev/lp0 c 6 0肖涪生刻鼓矽虹她锹抹烟截肥饥耶充擦危世膏位零扔泽曙寇晕衣僳巡赡仟第8章嵌入式设备驱动第8章嵌入式设备驱动61.4 Linux设备驱动代码的分布 l/block l/char l/cdrom l/pci l/scsi l/net l/sound 注:IDE接口的CD驱动位于drivers/block/i

5、de-cd.c中,而SCSI CD驱动位于drivers/scsi/scsi.c中 护喻综挤殿荚陛宗氖兢翁现闷渐模迸死乐漱誉漠茅毒讥刹时罢筋咕霖己酮第8章嵌入式设备驱动第8章嵌入式设备驱动71.5 Linux设备驱动程序的特点 l设备驱动是内核的一部分,影响内核稳定l为内核或其从属子系统提供一个标准接口l使用标准的内核服务如内存分配、中断和等待队列等 l大多数Linux设备驱动可以动态可加载 lLinux设备驱动程序可配置 l驱动程序维护其控制的设备,该设备即使不存在也不影响系统的运行,此时设备驱动只是占用少量系统内存,不会对系统造成什么危害 哮意谷仔坡内帚辣郴谰掘慨渍搅萍烁琅挤论写腑绒卞矣怨

6、膜疑亡配梯齿赘第8章嵌入式设备驱动第8章嵌入式设备驱动82、设备驱动程序结构 lLinux的设备驱动程序与外界的接口可以分成三部分:l与操作系统内核的接口 l与系统引导的接口 l与设备的接口 lLinux设备驱动程序的代码结构大致可以分为如下几个部分:l驱动程序的注册与注销、设备的打开与释放、设备的读写操作、设备的控制操作、设备的中断和轮询处理。 斯缸堪趟麓捶轰彻碗良陷奎汕随员粗读株幕垫纽妻夹暑人越丰氓曳拯慢呕第8章嵌入式设备驱动第8章嵌入式设备驱动92.1驱动程序的注册与注销 l注册 lregister_chrdev( );/在fs/devices.clregister_blkdev( );

7、/在fs/block_dev.cl注销 lunregister_chrdev( ) lunregister_blkdev( ) 秤初尉退赦五茬十万赐侯就银曰桨赫募脐黎步颂氏砧撰顷官咬肮汾鳖刻赐第8章嵌入式设备驱动第8章嵌入式设备驱动102.2 打开、释放、读、写、控制等struct file_operations struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*writ

8、e) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); in

9、t (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*readv) (struc

10、t file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long,

11、unsigned long, unsigned long);脸戈扼威项雾厄奴侦讨者趟壕褥谈远颈叉懦这卜肖淮辰谗淤斡盆苗尿击涸第8章嵌入式设备驱动第8章嵌入式设备驱动11lLinux内核将通过file_operations结构访问驱动程序提供的函数 l字符设备的读写直接使用函数read( )和write( ) l块设备需要调用函数block_read( )和block_write( ) lioctl( )的用法与具体设备密切关联,因此需要根据设备的实际情况进行具体分析 杂窿响歧摇你亦锭讣挽窘骂删闺栓拉止磋惟墓粳烷帮皂壬升吠粉槽鞠崎碴第8章嵌入式设备驱动第8章嵌入式设备驱动122.3 设备的轮询和

12、中断处理 l轮询l内核定期对设备的状态进行查询 l消耗不少的内核资源 l如果设备驱动被连接进入内核,这时使用轮询方式将会带来灾难性的后果 l中断l设备驱动向内核注册其使用的中断 l内核负责把硬件产生的中断传递给相应的设备驱动 l设备驱动在其中断处理过程中做得越少越好 悄拓婆棘贤练柒许郎饭潦窒诚谁廷特阐份尘捍笛枫兵材杏抄请疆栏魔瘫块第8章嵌入式设备驱动第8章嵌入式设备驱动13l问题:l如何查看设备驱动所对应的中断号及类型 ?参粱耪瞎乞首境禄疡奶陋姬趴蠕茨班钾控巨捉酥犯晦骋脖嘴埔胞纺未乍党第8章嵌入式设备驱动第8章嵌入式设备驱动143、设备驱动试验l实验一:编写一个简单的驱动程序 l实验二:设计和

13、实现一个KED&LED实验 l实验三:动态加载和静态编译驱动到内核 l实验四:使用中断方式的驱动程序设计 勿顿寞酞洱调悍炉辆汲兆昂去革胁您等詹翁肄旋仲是硬狭膳也殉氧痔蒸箕第8章嵌入式设备驱动第8章嵌入式设备驱动15实验一:编写简单的驱动程序(1)l1) 任务: 在XSBase开发板上编写一个简单的字符设备驱动程序。该字符设备具备4个基本操作:xsbase_open()、xsbase_write()、 xsbase_read() 、xsbase_release(),实现向这个新建的字符设备先写入一些数据,然后再从这个设备中读取这些数据。 卤巷己奎吝岿惹却钉碧努代歧津们跳他滴去右者詹硝粕昏货扬谅仇

14、赫沼氓第8章嵌入式设备驱动第8章嵌入式设备驱动16实验一:编写简单的驱动程序(2)l2)主要数据结构和全局变量 l系统fs/devices.c的struc device_struct结构 l创建一个xsbase.c文件,其中包含一些必要的头文件、宏和全局变量 struct device_struct const char * name; struct file_operations * fops;static struct device_struct chrdevsMAX_CHRDEV;账恨画谦堆捏扶多恩卿错绸年狸峡乔孵沽慎弹凡涂贾钒素竣珠窄酒敌晚碱第8章嵌入式设备驱动第8章嵌入式设备驱动17

15、实验一:编写简单的驱动程序(3)l主要接口函数 lfile_operations 结构的实例 注:这种结构的声明方法是一种标记化格式声明,便于移植。 static struct file_operations chr_fops = read: xsbase_read, write: xsbase_write, open: xsbase_open, release: xsbase_release,;元毯熟备紊碰茶霹确吵兆虑肢追陷烂吟赖阴敏片挂福操页韵同永杉颊嘘卢第8章嵌入式设备驱动第8章嵌入式设备驱动18实验一:编写简单的驱动程序(4)lxsbase_open()和xsbase_release(

16、) static int xsbase_open(struct inode *inode, struct file *file) MOD_INC_USE_COUNT; printk(This chrdev is opened!n); return 0;static int xsbase_release(struct inode *inode, struct file *file) MOD_DEC_USE_COUNT; printk(this chrdev is released!n); return 0;安悲揪斥筒深进幅才控枉社宝谱蛆抽尸膜尊乖闯斡娄颁茨娜眶咯偶唇托挫第8章嵌入式设备驱动第8章

17、嵌入式设备驱动19实验一:编写简单的驱动程序(5)lxsbase_read() static ssize_t xsbase_read(struct file *file, char *buf, size_t count, loff_t *f_pos) int len; if(count 0) return -EINVAL; len = strlen(data); if(len count) count = len; copy_to_user(buf, data, count+1); return count;大兜喇织娥掠订稽柴麓赁鹃蜕冕硒雄锄霖雨键懒涸鲤运爱刽宾咎钠慢珊慷第8章嵌入式设备驱动第

18、8章嵌入式设备驱动20实验一:编写简单的驱动程序(6)lxsbase_write() static ssize_t xsbase_write( struct file *file, const char *buffer, size_t count, loff_t *f_pos) if(count 0) return -EINVAL; kfree(data); data = (char *)kmalloc(sizeof(char)*(count+1), GFP_KERNEL); if(!data) return -ENOMEM; copy_from_user(data, buffer, coun

19、t+1); return count;别碌梳澈盼烯款锦膜受琐潜躯澄伎疆证闹裤侠颤皆春赤仓沦辱怒汉茹琴侄第8章嵌入式设备驱动第8章嵌入式设备驱动21实验一:编写简单的驱动程序(7)l3)模块加载:是两种将驱动加入内核的方式之一l编写init_module()res = register_chrdev(0, xsbase, &chr_fops); if(xsbase_major = 0) xsbase_major = res;l编写cleanup_module() unregister_chrdev(xsbase_major, xsbase);掇盗缄捻嚎沏疲部忧伶彦懦媚猾敞退艾刻垫竞策交凤品附斜兜

20、可带漾闷捅第8章嵌入式设备驱动第8章嵌入式设备驱动22实验一:编写简单的驱动程序(8)l4)驱动安装过程l新建xsbase.c文件,实现主要数据结构和函数接口。l编译生成xsbase.ol把目标文件加载到内核 l在Minicom中使用ZMODEM协议发送文件l执行$ arm-linux-gcc xsbase.c I /usr/src/xscale-linux/include c xsbase.c D_KERNEL_ -DMODULE$ insmod f xsbase.o乾怂哨矾帛瞬扛斑笑躁褐浑旺匠忧限瞻帅但秦催储挪搀员等铭寓氧提糊狠第8章嵌入式设备驱动第8章嵌入式设备驱动23实验一:编写简单的

21、驱动程序(9)l创建一个设备文件 l测试lOVER$ mknod /dev/xsbase c major minor荆沟批赔戮寿鹿赫蕴讳好洱贯狗丽辑劳恃诊近墒植痪谱僧享逃傀夜烛碳辉第8章嵌入式设备驱动第8章嵌入式设备驱动24实验二:编写KED&LED驱动(1)l在这个实验中,通过设计和实现一个KED&LED驱动程序,来控制目标板上的一组LED灯,在安装完驱动后,运行测试程序,就能点亮LED灯。 仔俘孺颧稻愁例锁崔枪葱硫尺枢姨毫肚疯醋瞩配伺抡求匹艇刷牢纯御厨高第8章嵌入式设备驱动第8章嵌入式设备驱动25实验二:编写KED&LED驱动(2)#define EXT_KEY_CS EXT_PORT2#

22、define EXT_LED_CS EXT_PORT3void led_off_on()int i;EXT_LED_CS = 0xff;for(i =0 ; i8;+i)EXT_LED_CS = (1 i) & 0xff);udelay(30000);EXT_LED_CS = 0xff;独袱腻掖罐乳允晦径沃州挫弘峡畅柑啮废弗增讹绿凿厉末屿镁绦钙箱找串第8章嵌入式设备驱动第8章嵌入式设备驱动26实验三:静态编译驱动到内核(1) l在确定自己代码位置的前提下,建立自己的源码目录、文件、Makefile、Config.in等。 l修改上层的config.in文件,把自己的驱动加入到内核配置系统中。

23、l修改上层Makefile,把自己的程序加入到内核编译系统中。 l确保自己的初始化函数被调用。 ldrivers/char/mem.c中的chr_dev_init() 或drivers/block/ll_rw_blk.c中的blk_dev_init() l用宏module_init来申明你的初始化函数 插漱嚣性蒜颓绚烙碴错筒石走熟耍匈蘑藉淤驰共俊虎师月医衅阵承皑弧逸第8章嵌入式设备驱动第8章嵌入式设备驱动27实验三:静态编译驱动到内核(2)l驱动位置和目录结构 $ cd drivers/xsbase$ tree .|- Config.in|- Makefile|- xsbase.c- xsba

24、se_test.c引洪畜圆映硝豫误供竖刊搓侨俐娱抠笼烤烤瘫红致瞳杯润逐辣秀椅放瞒猾第8章嵌入式设备驱动第8章嵌入式设备驱动28实验三:静态编译驱动到内核(3)l修改配置文件 l1)drivers/xsbase/Config.in # XSBASE driver configurationmainmenu_option next_commentcomment XSBASE Driverbool XSBASE support CONFIG_XSBASEif $CONFIG_XSBASE = y ; then tristate TEST user-space interface CONFIG_TES

25、T_USER bool TEST CPU CONFIG_TEST_CPUfiendmenu胁馒仕明课素疯碧亢俊弦犯丰刘纯汤鸟耪诗冒喀馒玫墨铃按偶技壮望柏膝第8章嵌入式设备驱动第8章嵌入式设备驱动29实验三:静态编译驱动到内核(4)l2) arch/arm/config.in l编写Makefile l1)drivers/xsbase/Makefile source drivers/xsbase/Config.inL_TARGET := test.aexport-objs := test.oobj-$(CONFIG_TEST) += test.oinclude $(TOPDIR)/Rules.m

26、akeclean:rm -f *.oa .*.flags下晨肝泄隙孺补嘻读缕夹械鸥剖狙鹅喝冬党愈早澜手瑰陵线灯秃乞消悦踊第8章嵌入式设备驱动第8章嵌入式设备驱动30实验三:静态编译驱动到内核(5)l2)drivers/Makefile l3)Makefilesubdir-$(CONFIG_MMC) += mmcsubdir-$(CONFIG_XSBASE) += xsbaseinclude $(TOPDIR)/Rules.makeDRIVERS-$(CONFIG_PLD) += drivers/pld/pld.oDRIVERS-$(CONFIG_MMC) += drivers/mmc/mmcd

27、rivers.oDRIVERS-$(CONFIG_XSBASE) += drivers/xsbase/xsbase.oDRIVERS := $(DRIVERS-y)岔幂崔悬滦弥承劈帮白滔蜀梭坪厉痹噎柜池申诸港园伐巾诈窘浦帝侄痴埔第8章嵌入式设备驱动第8章嵌入式设备驱动31实验四:中断方式的驱动程序(1) l注册中断处理程序 l什么叫中断信号线(IRQ号)?l何时请求IRQ号更合适?l初始化时l设备第一次打开时 int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), unsigned lo

28、ng flags, const char *dev_name, void *dev_id);void free_irq(unsigned int irq, void *dev_id);噎禹提赏宋朴陷尹必永兑潍菜逝恰椒界诞答径膛壤亚成桑扁匆昧倦凸备俞第8章嵌入式设备驱动第8章嵌入式设备驱动32实验四:中断方式的驱动程序(2)l编写中断处理程序 static void rtc_interrupt(int irq, void *dev_id, struct pt_regs *regs) spin_lock (&rtc_lock); rtc_irq_data += 0x100; rtc_irq_dat

29、a &= 0xff; rtc_irq_data |= (CMOS_READ(RTC_INTR_FLAGS) & 0xF0); if (rtc_status & RTC_TIMER_ON) mod_timer(&rtc_irq_timer, jiffies + HZ/rtc_freq + 2*HZ/100); spin_unlock (&rtc_lock); wake_up_interruptible(&rtc_wait); kill_fasync (&rtc_async_queue, SIGIO, POLL_IN);炉骸宏辆捡慨份釉掘小钙撞粪红撼州途拌虑叔勺密兆甲亩涧泰榨锭凶妮爆第8章嵌入式设

30、备驱动第8章嵌入式设备驱动33实验四:中断方式的驱动程序(3)l中断处理机制的实现 渔荔森雏辅聚月痕锯互仰哲军桥签羹琶筒妒张蹬臆炭淀谐疙峻狐嘘倪陪精第8章嵌入式设备驱动第8章嵌入式设备驱动34实验四:中断方式的驱动程序(4)l中断控制 这些函数更新可编程中断控制器(PIC)中指定中断的掩码,因而,这样就可以在所有的处理器上禁止或者启动 IRQ。对这些函数的调用是可以嵌套的如果 disable_irq() 被成功调用两次,在 IRQ 真正重新打开之前,需要执行两次 enable_irq() 调用。 void disable_irq(int irq); void disable_irq_nosyn

31、c(int irq); void enable_irq(int irq);夷吃权瞒析蕴苯预殃瞧忧稍抽九栈胰拌瘟棺镐徒彩稠招彝戌贷顾鸵嘛抬资第8章嵌入式设备驱动第8章嵌入式设备驱动35驱动设计中涉及的一些具体问题驱动设计中涉及的一些具体问题 l用户空间和内核空间 l/proc文件系统 文件/目录名描述Apm高级电源管理信息Bus包含了总线以及总线上设备信息的目录,子目录以总线类型组织Cmdline内核的命令行参数CpuinfoCPU信息,包括主频、类型等信息Devices系统字符和块设备编号及驱动程序名Dma正在使用的DMA通道Driver组织了不同的驱动程序鸣铁衡邮付若互昭搜召佐吩凄烫汕饲亨迭

32、路宪孕蝇肃憨耸胖塞庞伪孔灼须第8章嵌入式设备驱动第8章嵌入式设备驱动36execdomains和安全相关的execdomainFbframebuffer设备Filesystems系统支持的文件系统类型Fs文件系统需要的参数,对NFS/export有效Ide包含了IDE子系统信息的目录Interrupts系统注册的中断信息,其内容包括中断号、收到的中断数、驱动器名等。Iomem内存映像IoportsI/O端口使用情况Irq与cpu有关的中断掩码Kcore内核的core文件映像,记录了系统物理内存情况。可以使用gdb程序从中检查内核数据结构。该文件不是文本格式,不能用cat等文本查看器查看其内容。

33、糯哨渣菜叹送拨阴磊铣噎辖第富业上泰峭边封京呀花免嘉赌哨掌揽眉坞切第8章嵌入式设备驱动第8章嵌入式设备驱动37Kmsg内核消息,可以从该文件检索内核使用printk()产生的消息。Ksyms内核符号表,包括内核标识符地址和名称Loadavg最近1分,5分,15分钟时候的系统平均负载量Locks内核锁,记录与被打开的文件有关的锁信息Mdstat被md设备驱动程序控制的RAID设备的信息Meminfo内存信息Misc杂项设备信息Modules系统正在使用module信息Mounts已经装载的文件系统Net保存网络信息的目录Partitions硬盘分区情况什嘻履溢扩嘘幌唉狄帜焙药恫蹭肤兆美瑟佳锅缮赵袭

34、傣忌抖汛屡监谢辑朴第8章嵌入式设备驱动第8章嵌入式设备驱动38PciPCI总线上设备情况ScsiSCSI设备信息Slabinfoslab池信息Stat静态统计信息,包括CPU的使用情况、磁盘、页面、交换、启动时间等数据。Swap交换分区的使用情况Sys可以更改的内核数据的目录Sysvipc和sys V IPC相关数据文件目录,包括系统中消息队列(msg文件)、信号量(sem文件)、共享内存(shm文件) 的信息。Tty和终端相关的数据Uptime从系统启动到现在所经过的秒数及系统空闲时间。Version内核版本数据捣机吟乌唬挖娇饥朝犁蹄位痈羡铁认胰吭野才苏侦吗猖娟赴晚猩谩糙淡恿第8章嵌入式设备驱动第8章嵌入式设备驱动39

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号