版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式LINUX设备驱动程序
本讲主要内容嵌入式linux设备驱动的基本框架与实现数码管显示驱动程序分析帧缓冲显示驱动实现方法。Linux系统中的设备文件Linux将所有外部设备看成是一类特殊文件,称之为“设备文件”。如果说系统调用是Linux内核和应用程序之间的接口,那么设备驱动程序则可以看成是Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文件一样来操作外部设备Linux设备驱动在系统中的层次设备驱动的作用设备驱动是位于应用和物理设备之间的软件层,负责完成二者间的I/O操作;在LINUX系统里,对用户程序,设备驱动隐藏了设备的具体细节,为不同设备提供了一致的接口;设备驱动是嵌入式系统开发的重要内容之一设备驱动完成的主要功能对设备的初始化和释放;将数据从内核传递到硬件设备,以及从硬件读取数据;读取应用程序传送给设备文件的数据,并回送应用程序请求的数据。这需要在用户空间、内核空间、总线以及外设之间传输数据;检查和处理设备出现的错误。设备驱动的分类Linux支持3种不同类型的设备字符设备块设备网络接口字符设备能够像字节流一样被访问的设备,一般不需要缓存技术,也不支持随机访问。典型的字符设备有:鼠标、键盘、I/O设备等。设备驱动的分类块设备支持面向块访问的设备,每块包含2的N次幂字节数据,典型的块大小为512或1024B;大多数块设备允许随机访问,而且常常采用buffer、cache等缓存技术;块设备的访问常常通过文件系统来进行;典型的块设备有:如磁盘、硬盘、光盘驱动器等。设备驱动的分类网络接口能够和其他主机交换数据的设备接口。网络接口只是面向数据包而不是数据流,它没有被映射为任何设备文件,其访问要通过BSD套接口进行。设备驱动的的分类主设备号与与次设备号号LINUX系统中,,设备由一一个主设备号和一个次设备号来唯一标识;主设备号唯一标识了了设备类型型,即设备备驱动程序序类型,它它是块设备备表或字符符设备表中中设备表项项的索引。。一些典型设设备的主设设备号已经经基本固定定下来,例例如,软驱驱的主设备备号为2,IDE硬盘的主设设备号为3等等。设备宏操作作MAJOR()可可以获取主主设备号。。主设备号与与次设备号号次设备号用于标识使使用同一设设备驱动程程序的不同同硬件,并并仅由设备备驱动程序序解释当应用程序序操作某个个设备文件件时,Linux内核根据其其主设备号号调用相应应的驱动程程序,并从从用户态进入入内核态驱动程序判判断次设备备号,并完完成相应的的硬件操作作。用户空间和和内核空间间Linux运行在2种模式下下内核模式用户模式内核模式对对应内核空空间,而用用户模式对对应用户空空间。驱动程序作作为内核的的一部分,,它对应内内核空间,,应用程序序不能直接接访问其数数据,用户空间和和内核空间间用户空间和和内核空间间的数据传传递:copy_to_user(void*to,constvoid*from,unsignedlongcount);copy_from_user(void*to,constvoid*from,unsignedlongcount);__copy_to_user()__copy_from_user()第一种方法法在复制数数据的同时时,会进行行地址空间间的有效性性检查。内核设备驱驱动模块设备驱动程程序以两种种方式添加加到内核::Buildin直接把驱动动程序编译译到内核代代码中Module以模块的方方式加载驱驱动程序加载:insmoddriver.o卸载:rmmoddriver查看:lsmodLinux设备节点点的添加设备节点位位于/dev路径下下可用如下命命令添加dev节点点,b代代表块设备备,C表示示字符设备备mknod/dev/hda1b(/c)1271块设备,主主设备号127,次次设备号1Linux设备驱动代代码的分布布/char:字符设设备驱动源码;/block:块设设备驱动源码;/cdrom:LinuxCDROM驱动源码。这里可以找找到某些特特殊的CDROM设设备(如SoundblasterCDROM)。IDE接口的的CD驱动动位于drivers/ide/ide-cd.c中而而SCSICD驱动动位于drivers/scsi/scsi.c中。/pci::它包含了了PCI伪伪设备驱动动源码。这这里可以找找到关于PCI子系系统映射与与初始化的的代码。Linux设备驱动代代码的分布布/scsi:所有的的SCSI代码以及及Linux支持的的SCSI设备的设设备驱动。。/net::包含网络络驱动源码码。/sound:所有有的声卡驱驱动源码。。/video:所有有的视频卡卡驱动源码码。Linux设备驱动的的代码结构构驱动程序的的注册与注注销设备的打开开与释放设备的读写写操作设备的控制制操作设备的中断断和轮询处处理等19设备驱动的的注册方法1result=devfs_register_chrdev(0,MOD_NAME,&keypad_fops)if(result<0){return-ENODEV;}devfs_handle=devfs_register(NULL,MOD_NAME,,result,0,,&keypad_fops,NULL);MOD_NAME:设备驱动动的名称;;keypad_fops::文件操作作指针。优点:无需需手动创建建设备节点点,由系统统自动完成成。对于块设备备的注册,,具有类似似函数:devfs_register_blkdev以及操作作过程。设备驱动的的注册方法2result=register_chrdev(0,MOD_NAME,&keypad_fops);或者result=register_blkdev(0,MOD_NAME,&keypad_fops);if(result<0){ return-ENODEV; }mknod/dev/MOD_NAMECMAJORMINOR设备驱动的的注销方法1devfs_unregister_chrdev(MAJOR,MOD_NAME);或者devfs_unregister_blkdev(MAJOR,MOD_NAME);devfs_unregister(devfs_handle);方法2unregister_chrdev(Major,MOD_NAME);或者unregister_blkdev(Major,MOD_NAME);rm/dev/MOD_NAME设备备的的打打开开与与释释放放设备备的的打打开开与与释释放放要要通通过过文文件件操操作作结结构构体体中中定定义义的的相相关关函函数数open()和和release()来来完完成成;;主要要完完成成设设备备的的初初始始化化工工作作以以及及设设备备的的释释放放。。文件件操操作作结结构构体体的的定定义义structfile_operations{structmodule*owner;ssize_t(*read)(structfile*,char*,size_t,loff_t*);ssize_t(*write)(structfile*,constchar*,size_t,loff_t*);unsignedint(*poll)(structfile*,structpoll_table_struct*);int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);int(*mmap)(structfile*,structvm_area_struct*);文件件操操作作结结构构体体的的定定义义int(*open)(structinode*,structfile*);int(*release)(structinode*,structfile*);int(*fsync)(structfile*,structdentry*,intdatasync);};文件件操操作作结结构构体体的的主主要要函函数数open:用用于于打打开开文文件件设设备备release:在在关关闭闭文文件件的的调调用用read:用用于于从从设设备备中中读读取取数数据据write:向向设设备备发发送送数数据据poll:查查询询设设备备是是否否可可读读或或可可写写ioctl:提提供供执执行行设设备备特特定定命命令令的的方方法法fasync:用于设设备的异步通通知操作设备的读写字符设备的读读写操作可以以直接使用read()和write()函数数来完成,块设备的读写写,需要调用用block_read()和block_write()函数,这这2个函数向向设备请求表表中增加读写写请求;块设备的读写写是对内存缓缓冲区进行操操作,如果内内存缓冲区中中没有要读入入的数据,或或者缓冲区中中的数据需要要写入设备,,可以通过调用用数据结构blk_dev_struct中的的函数request_fn()完完成。设备的控制操操作对设备的控制制操作可通过过文件操作数数据结构中的的ioctl()函数来来完成。控制操作与具具体的设备有有密切关系,,需要根据设设备实际情况况进行具体分分析。设备的轮询和和中断处理轮询方式对于不支持中中断的硬件设设备,读写时时需要轮流查查询设备的状状态,以便决决定随后的数数据操作。如果轮询处理理方式的驱动动程序被链接接到内核,则则意味着查询询过程中,内内核一直处于于闲置状态。。解决办法是使使用内核定时时器,进行定定期查询。设备的轮询和和中断处理中断处理方式式硬件在需要的的时候,向内内核发出中断断请求信号,,而内核则负负责把中断信信号传递给相相应的设备驱驱动。驱动程序必须须在设备驱动动的初始化时时申请中断资资源,并注册册中断处理函函数:申请:request_irq(irq,irq_handler,flag,dev_name,dev_id);释放:free_irq(irq,dev_id);其中irq为为申请的中断断线号,irq_handler为为注册的中断断处理函数,,dev_id用于共共享中断信号号线。典型字符驱动动程序框架staticstructfile_operationsdemo_fops={read:demo_readwrite: demo_writeopen:demo_open……};intinit_module(void){ returndemo_init();}用于注注册设备驱动动、申请中断断线,初始化化等voidcleanup_module(void){ demo_cleanup();}用于注注销设备驱动动、释放中断断线等接口函数的实实现……Example1PXA270开发系统的的按键驱动程程序与数码显显示驱动数码显示源代代码按键驱动源代代码调试驱动程序序,使用printk输输出信息,信信息的优先级级依次为:KERN_EMERGKERN_ALERTKERN_CRITKERN_ERRKERN_WARNINGKERN_NOTICEKERN_INFOKERN_DEBUG如果要在终端端输出信息,,编译选项::-Wall–O2根据/kernel/printk.c的不同同设置,不显显示的信息会会出现在/var/log/messages中驱动调试方法法参见LinuxDeviceDriverschapter3帧缓冲设备驱驱动程序LCD分类LCD可由为为液晶照明的的方式有两种种:传送式和和反射式传送式屏幕要要使用外加光光源照明,称称为背光(backlight),,照明光源要要安装在LCD的背后。。传送式LCD在正常光光线及暗光线线下,显示效效果都很好,,但在户外,,尤其在日光光下,很难辩辩清显示内容容。反射式屏幕,,则不需要外外加照明电源源,使用周围围环境的光线线(或在某些些笔记本中,,使用前部照照明系统的光光线)。这样样,反射式屏屏幕就没有背背光,所以,,此种屏幕在在户外或光线线充足的室内内,才会有出出色的显示效效果,但在一一般室内光线线下,这种显显示屏的显示示效果就不及及背光传送式式的。帧缓冲(Framebuffer)帧缓冲(framebuffer)-显示缓冲冲区是Linux为显示设备备提供的一个个接口,是把把显存抽象后后的一种设备备,他允许上上层应用程序序在图形模式式下直接对显显示缓冲区进进行读写操作作。Xwindow绘制窗口口,显示汉字字都是通过fb帧缓冲设备Linux可可支持最多32个/dev/fb0~/dev/fb31缺省是/dev/fb0可以直接拷贝贝位图到fb来显示到屏屏幕cp/bitmap/penguin.bin/dev/fb0帧缓冲设备驱驱动原理帧缓冲设备属属于字符设备备,其目的就是通通过配置PXA270的的寄存器,在在一段指定的的内存与LCD之间建立立一个自动传传输的通道。这样,任何何程序只要修修改这段内存存中的数据,,就可以改变变LCD上的的显示内容。。帧缓冲设备的的文件操作层层接口staticstructfile_operationsfb_fops={
owner:THIS_MODULE,
read:fb_read,/*读操作*/write:fb_write,/*写写操作*/ioctl:fb_ioctl,/*控控制操作*/mmap:fb_mmap,/*映射操操作*/open:fb_open,/*打开操操作*/release:fb_release,/*关关闭操作*/
};其其中的成成员函数都在在文件linux/driver/video/fbmem.c中定定义帧缓冲设备的的文件操作层层接口控制操作函数数fb_ioctl通过以下参数数来传递控制制命令FBIOGET_VSCREENINFOFBIOPUT_VSCREENINFOFBIOGET_FSCREENINFO映射操作函数数fb_mmap将显示缓存映映射到用户空空间帧缓冲设备的的驱动层接口口—fb_infostructfb_info{charmodename;/*defaultvideomode*/charfontname;/*defaultfontname*/……structfb_var_screeninfovar;/*Currentvar*/structfb_fix_screeninfofix;/*Currentfix*/……structfb_ops*fbops;char*screen_base;/*Virtualaddress*/……};帧缓冲冲设备备的驱驱动层层接口口—fb_infoModename::设备备名称称;Fontname::显示示字体体;fb_var_screeninfo:记记录用用户可可修改改的显显示控控制器器参数数,包包括屏屏幕分分辨率率和每每个像像素点点的比比特数数,其其中的的xres定义义屏幕幕一行行有多多少个个象素素点,yres定定义屏屏幕一一列有有多少少个象象素点点,bits_per_pixel定定义每每个象象素点点用多多少个个字节节表示示;帧缓冲冲设备备的驱驱动层层接口口—fb_infofb_fix_screeninfo:记记录用用户不不能修修改的的显示示控制制器的的参数数,如如屏幕幕缓冲冲区的的物理理地址址,长长度。。当对对帧缓缓冲设设备进进行映映射操操作的的时候候,就就是从从fb_fix_screeninfo中中取得得缓冲冲区物物理地地址的的。Fb_ops::指向向底层层操作作的函函数的的指针针;结构体体fb_info的的定义义如何写写帧缓缓冲设设备驱驱动遵循设设备驱驱动程程序的的结构构,设设备注注册、、定义义file_operations接口、、初始始化LCDC寄寄存器器初始化化一个个fb_info结构,,填充充其中中的成成员变变量,,并调调用register_framebuffer(&fb_info),将fb_info登记入入内核核。实现定定义的的各个个接口口函数数帧缓冲冲驱动动程序序—初始化化函数数新的FB驱驱动程程序,,需要要向fbmem.c(drivers/video)中中的结结构体体fb_drivers中添添加相相应的的参数数来给给出初初始化化函数数的入入口。。staticstruct{constchar*name;int(*init)(void);int(*setup)(char*);}fb_drivers[]__initdata={#ifdefCONFIG_FB_PXA……{"pxa",pxafb_init,pxafb_setup},#endif……}帧缓冲冲驱动动程序序—初始化化函数数dbmx1fb_init的的主要要操作作初始化化相关关的寄寄存器器初始化化一个个fb_info结结构,,填充充其中中的成成员变变量利用register_framebuffer()向向内核核注册册该设设备。。如何写写帧缓缓冲的的应用用程序序在应用用程序序中,,操作作帧缓缓冲设设备的的一般般步骤骤如下下:1.打开/dev/fb设备文文件。。2.用ioctrl操作取取得当当前显显示屏屏幕的的参数数,如如屏幕幕分辨辨率,,每个个像素素点的的比特特数。。根据据屏幕幕参数数可计计算屏屏幕缓缓冲区区的大大小。。3.将屏幕幕缓冲冲区映映射到到用户户空间间。4.映射后后就可可以直直接读读写屏屏幕缓缓冲区区,进进行绘绘图和和图片片显示示典型应应用的的代码码结构构(1)intmain(){intfbfd=0;structfb_var_screeninfovinfo;structfb_fix_screeninfofinfo;longintscreensize=0;/*打开设设备文文件*/fbfd=open("/dev/fb0",O_RDWR);典型应应用的的代码码结构构(2)/*取得屏屏幕相相关参参数*/ioctl(fbfd,FBIOGET_FSCREENINFO,&finfo);ioctl(fbfd,FBIOGET_VSCREENINFO,&vinfo);/*计算屏屏幕缓缓冲区区大小小*/screensize=vinfo.xres*vinfo.yres*vinfo.bits_per_pixel/8;/*映射屏屏幕缓缓冲区区到用用户地地址空空间*/fbp=(char*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fbfd,0);/*下面可可通过过fbp指针读读写缓缓冲区区*/……}帧缓冲冲设备备的映映射mmapFb设设备驱驱动工工作在在内核核空间间,不不允许许用户户应用用程序序直接接访问问fb物理理地址址Linux在fb设设备驱驱动的的file_operations结构构中提提供了了mmap函数数,将屏幕幕缓冲冲区的的物理理地址址映射射到用用户空空间的的一段段虚拟拟地址址,用户就就可以以通过过读写写这段段虚拟拟地址址访问问屏幕幕缓冲冲区,,在屏屏幕上上绘图图fbp=(char*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fbfd,0);帧缓冲冲设备备的ioctl帧缓冲设设备,对对设备文文件的ioctl操作作可读取取/设置置显示设设备及屏屏幕的参参数,如如分辨率率、颜色色数、幕幕大小等等。ioctl的操作作是由底底层的帧帧缓冲驱驱动程序序来完成成的。/*取得得屏幕相相关参数数*/ioctl(fbfd,FBIOGET_FSCREENINFO,&finfo);ioctl(fbfd,FBIOGET_VSCREENINFO,&vinfo);一个帧缓缓冲应用用例子Fb_test:利用用帧缓冲冲设备画画点,画画线,填填充区域域,显示示ascii字字符,显显示汉字字FB_TestExampleCode9、静夜夜四无无邻,,荒居居旧业业贫。。。12月月-2212月月-22Thursday,December29,202210、雨雨中中黄黄叶叶树树,,灯灯下下白白头头人人。。。。12:55:4512:55:4512:5512/29/202212:55:45PM11、以我独沈沈久,愧君君相见频。。。12月-2212:55:4512:55Dec-2229-Dec-2212、故人江海海别,几度度隔山川。。。12:55:4612:55:4612:55Thursday,December29,202213、乍见见翻疑疑梦,,相悲悲各问问年。。。12月月-2212月月-2212:55:4612:55:46December29,202214、他乡生生白发,,旧国见见青山。。。29十十二月202212:55:46下下午12:55:4612月-2215、比比不不了了得得就就不不比比,,得得不不到到的的就就不不要要。。。。。十二二月月2212:55下下午午12月月-2212:55December29,202216、行动动出成成果,,工作作出财财富。。。2022/12/2912:55:4612:55:4629December202217、做前,,能够环环视四周周;做时时,你只只能或者者最好沿沿着以脚脚为起点点的射线线向前。。。12:55:46下下午12:55下下午12:55:4612月-229、没有失失败,只只有暂时时停止成成功!。。12月-2212月-22Thursday,December29,202210、很多多事情情努力力了未未必有有结果果,但但是不不努力力却什什么改改变也也没有有。。。12:55:4612:55:4612:5512/29/202212:55:46PM11、成功就是日日复一日那一一点点小小努努力的积累。。。12月-2212:55:4612:55Dec-2229-Dec-2212、世世间间成成事事,,不不求求其其绝绝对对圆圆满满,,留留一一份份不不足足,,可可得得无无限限完完美美。。。。12:55:4612:55:4612:55Thursday,December29,202213、不知知香积积寺,,数里里入云云峰。。。12月月-2212月月-2212:55:4612:55:46December29,202214、意志坚坚强的人人能把世世界放在在手中像像泥块一一样任意意揉捏
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑施工反垄断合同范本
- 农药生产架电施工合同
- 涂料施工销售渠道合同
- 林业开发供货施工合同范本
- 餐饮与企业合同范例
- 饭店公司合伙合同范例
- 公路工程项目合同进度检查内容表格
- 集体合同约定的最低工资和当地最低工资标准
- 门诊医疗器械销售合同范例
- 赠与合同范例15篇
- (完整word版)首件检验管理制度
- 线路工程灌注桩施工作业指导书施工方案
- 重力坝的分缝与止水
- 三重管高压旋喷桩施工工艺规程与施工方案
- 个体诊所药品清单
- PFMEA的严重度SOD的评分和优先级别
- 国网基建国家电网公司输变电工程结算管理办法
- 100道递等式计算(能巧算得要巧算)
- 中国地图含省份信息可编辑矢量图
- 路政运政交通运输执法人员考试题库
- 企业技术标准化管理
评论
0/150
提交评论