《[精选]嵌入式课程-第8讲(嵌入式LINUX设备驱动程序).pptx》由会员分享,可在线阅读,更多相关《[精选]嵌入式课程-第8讲(嵌入式LINUX设备驱动程序).pptx(54页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式嵌入式LINUXLINUX设备驱动设备驱动程序程序 本讲主要内容1.1.1.1.嵌入式嵌入式linuxlinux设备驱动的基本框架与实现设备驱动的基本框架与实现2.2.2.2.数码管显示驱动程序分析数码管显示驱动程序分析3.3.3.3.帧缓冲显示驱动实现方法。帧缓冲显示驱动实现方法。Linux系统中的设备文件系统中的设备文件LinuxLinux将所有外部设备看成是一类特殊文件,将所有外部设备看成是一类特殊文件,称之为称之为“设备文件。设备文件。如果说系统调用是如果说系统调用是LinuxLinux内核和应用程序之间内核和应用程序之间的接口,那么设备驱动程序则可以看成是的接口,那么设备驱动程
2、序则可以看成是LinuxLinux内核与外部设备之间的接口。内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文上的细节,使得应用程序可以像操作普通文件一样来操作外部设备件一样来操作外部设备LinuxLinux设备驱动在系统中的层次设备驱动在系统中的层次设备驱动的作用设备驱动的作用设设备备驱驱动动是是位位于于应应用用和和物物理理设设备备之之间间的的软软件层,负责完成二者间的件层,负责完成二者间的I/O操作;操作;在在LINUX系系统统里里,对对用用户户程程序序,设设备备驱驱动动隐隐藏藏了了设设备备的的具具体
3、体细细节节,为为不不同同设设备备提提供供了一致的接口;了一致的接口;设设备备驱驱动动是是嵌嵌入入式式系系统统开开发发的的重重要要内内容容之之一一设备驱动完成的主要功能设备驱动完成的主要功能n对设备的初始化和的初始化和释放;放;n将数据从内核将数据从内核传递到硬件到硬件设备,以及从硬件,以及从硬件读取数据;取数据;n读取取应用程序用程序传送送给设备文件的数据,并回文件的数据,并回送送应用程序用程序请求的数据。求的数据。n这需要在用需要在用户空空间、内核空、内核空间、总线以及以及外外设之之间传输数据;数据;n检查和和处理理设备出出现的的错误。设备驱动的分类设备驱动的分类n nLinux支持支持3种
4、种不同不同类型的型的设备n n字符字符设备n n块设备n n网网络接口接口n n字符字符设备vv能能够像字像字节流一流一样被被访问的的设备,一般不,一般不需要需要缓存技存技术,也不支持随机,也不支持随机访问。vv典型的字符典型的字符设备有:鼠有:鼠标、键盘、I/O设备等。等。设备驱动的分类设备驱动的分类n块设备支持面向支持面向块访问的的设备,每,每块包含包含2的的N次次幂字字节数据,典型的数据,典型的块大小大小为512或或1024B;大多数大多数块设备允允许随机随机访问,而且常常采用,而且常常采用buffer、cache等等缓存技存技术;块设备的的访问常常通常常通过文件系文件系统来来进行行;典
5、型的典型的块设备有:如磁有:如磁盘、硬、硬盘、光、光盘驱动器等。器等。设备驱动的分类设备驱动的分类n网网络接口接口能能够和其他主机交和其他主机交换数据的数据的设备接口。接口。网网络接口只是面向数据包而不是数据流,接口只是面向数据包而不是数据流,它没有被映射它没有被映射为任何任何设备文件,其文件,其访问要通要通过BSD套接口套接口进行。行。设备驱动的分类设备驱动的分类主设备号与次设备号主设备号与次设备号LINUX系统中,设备由一个系统中,设备由一个主设备号主设备号和一个和一个次设备号次设备号来来唯一唯一标识;标识;主设备号主设备号唯一标识了设备类型,即设备驱动程序类型,它唯一标识了设备类型,即设
6、备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。是块设备表或字符设备表中设备表项的索引。一些典型设备的主设备号已经基本固定下来,例一些典型设备的主设备号已经基本固定下来,例如,软驱的主设备号为如,软驱的主设备号为2,IDE硬盘的主设备号为硬盘的主设备号为3等等。等等。设备宏操作设备宏操作MAJOR可以获取主设备号。可以获取主设备号。主设备号与次设备号主设备号与次设备号次设备号次设备号用于标识使用同一设备驱动程序的不同硬用于标识使用同一设备驱动程序的不同硬件,并仅由设备驱动程序解释件,并仅由设备驱动程序解释 当应用程序操作某个设备文件时,当应用程序操作某个设备文件时,Linux内核根据
7、其主设备号调用相应的驱动程序,内核根据其主设备号调用相应的驱动程序,并从用户态进入内核态并从用户态进入内核态驱动程序判断次设备号,并完成相应的硬驱动程序判断次设备号,并完成相应的硬件操作。件操作。用户空间和内核空间用户空间和内核空间Linux运行在运行在2种模式下种模式下内核模式内核模式用户模式用户模式内核模式对应内核空间,而用户模式对应用内核模式对应内核空间,而用户模式对应用户空间。户空间。驱动程序作为内核的一局部,它对应内核空驱动程序作为内核的一局部,它对应内核空间,应用程序不能直接访问其数据,间,应用程序不能直接访问其数据,用户空间和内核空间用户空间和内核空间用户空间和内核空间的数据传递
8、:用户空间和内核空间的数据传递:copy_to_uservoid*to,const void*from,unsigned long count;copy_from_uservoid*to,const void*from,unsigned long count;_copy_to_user_copy_from_user第一种方法在复制数据的同时,会进行地址空第一种方法在复制数据的同时,会进行地址空间的有效性检查。间的有效性检查。内核设备驱动模块内核设备驱动模块n设备驱动程序以两种方式添加到内核:设备驱动程序以两种方式添加到内核:nBuild inn直接把驱动程序编译到内核代码中直接把驱动程序编译到
9、内核代码中nModulen以模块的方式加载驱动程序以模块的方式加载驱动程序n加载:加载:insmod driver.on卸载:卸载:rmmod drivern查看:查看:lsmodLinux设备节点的添加设备节点的添加n设备节点位于设备节点位于/dev路径下路径下n可用如下命令添加可用如下命令添加dev节点节点,b 代表块设备,代表块设备,C表示字符设备表示字符设备nmknod /dev/hda1 b/c 127 1块设备,主设备号块设备,主设备号127,次设备号,次设备号1Linux设备驱动代码的分布设备驱动代码的分布n/char:字符:字符设备驱动源码源码;n/block:块设备驱动源码源
10、码;n/cdrom:Linux CDROM驱动源码驱动源码。n这里可以找到某些特殊的里可以找到某些特殊的CDROM设备如如SoundblasterCDROM。IDE接口的接口的CD驱动位于位于drivers/ide/ide-cd.c中而中而SCSICD驱动位位于于drivers/scsi/scsi.c中。中。n/pci:它包含了:它包含了PCI伪设备驱动源源码。这里可里可以找到关于以找到关于PCI子系子系统映射与初始化的代映射与初始化的代码。Linux设备驱动代码的分布设备驱动代码的分布n/scsi:所有的:所有的SCSI代代码以及以及Linux支持的支持的SCSI设备的的设备驱动。n/net
11、:包含网:包含网络驱动源源码。n/sound:所有的声卡:所有的声卡驱动源源码。n/video:所有的:所有的视频卡卡驱动源源码。Linux设备驱动的代码结构设备驱动的代码结构驱动程序的注册与注销驱动程序的注册与注销设备的翻开与释放设备的翻开与释放设备的读写操作设备的读写操作设备的控制操作设备的控制操作设备的中断和轮询处理等设备的中断和轮询处理等 19设备驱动的注册设备驱动的注册方法方法1 1result=devfs_register_chrdevresult=devfs_register_chrdev0,MOD_NAME,&keypad_fops0,MOD_NAME,&keypad_fops
12、 if if result 0 result 0 return-ENODEV;return-ENODEV;devfs_handle=devfs_registerdevfs_handle=devfs_registerNULL,MOD_NAME,NULL,MOD_NAME,result,0,&keypad_fops,NULL,result,0,&keypad_fops,NULL;MOD_NAME:MOD_NAME:设备驱动的名称;设备驱动的名称;keypad_fopskeypad_fops:文件操作:文件操作指针。指针。优点:无需手动创立设备节点,由系统自动完成。优点:无需手动创立设备节点,由系统
13、自动完成。对于块设备的注册,具有类似函数对于块设备的注册,具有类似函数:devfs_register_blkdev:devfs_register_blkdev以及操作过程。以及操作过程。设备驱动的注册设备驱动的注册方法方法2 2result=register_chrdevresult=register_chrdev0,MOD_NAME,0,MOD_NAME,&keypad_fops&keypad_fops;或者或者result=register_blkdevresult=register_blkdev0,0,MOD_NAME,&keypad_fopsMOD_NAME,&keypad_fops;
14、if if result 0 result 0 return-ENODEV;return-ENODEV;mknod/dev/MOD_NAME C MAJOR MINORmknod/dev/MOD_NAME C MAJOR MINOR设备驱动的注销设备驱动的注销方法方法1 1devfs_unregister_chrdevdevfs_unregister_chrdevMAJOR,MAJOR,MOD_NAMEMOD_NAME;或或 者者 devfs_unregister_blkdevdevfs_unregister_blkdev MAJOR,MAJOR,MOD_NAMEMOD_NAME;devfs_
15、unregisterdevfs_unregisterdevfs_handledevfs_handle;方法方法2 2unregister_chrdevunregister_chrdevMajor,MOD_NAMEMajor,MOD_NAME;或或者者unregister_blkdevunregister_blkdevMajor,Major,MOD_NAMEMOD_NAME;rm/dev/MOD_NAME rm/dev/MOD_NAME 设备的翻开与释放设备的翻开与释放设备的翻开与释放要通过文件操作结构体中设备的翻开与释放要通过文件操作结构体中定义的相关函数定义的相关函数openopen和和re
16、leaserelease来完来完成;成;主要完成设备的初始化工作以及设备的释放。主要完成设备的初始化工作以及设备的释放。文件操作结构体的定义文件操作结构体的定义struct file_operationsstruct file_operations struct module*owner;struct module*owner;ssize_t ssize_t*read*read struct file*,char struct file*,char*,size_t,loff_t*,size_t,loff_t*;ssize_t ssize_t*write*write struct file*,s
17、truct file*,const char*,size_t,loff_t*const char*,size_t,loff_t*;unsigned int unsigned int*poll*poll struct file*,struct file*,struct poll_table_struct*struct poll_table_struct*;int int*ioctl*ioctl struct inode*,struct struct inode*,struct file*,unsigned int,unsigned longfile*,unsigned int,unsigned
18、long;int int*mmap*mmap struct file*,struct struct file*,struct vm_area_struct*vm_area_struct*;文件操作结构体的定义文件操作结构体的定义int int*open*open struct inode*,struct struct inode*,struct file*file*;int int*release*release struct inode*,struct inode*,struct file*struct file*;int int*fsync*fsync struct file*,struc
19、t struct file*,struct dentry*,int datasyncdentry*,int datasync;文件操作结构体的主要函数文件操作结构体的主要函数open:open:用于翻开文件设备用于翻开文件设备release:release:在关闭文件的调用在关闭文件的调用read:read:用于从设备中读取数据用于从设备中读取数据write:write:向设备发送数据向设备发送数据poll:poll:查询设备是否可读或可写查询设备是否可读或可写ioctl:ioctl:提供执行设备特定命令的方法提供执行设备特定命令的方法fasync:fasync:用于设备的异步通知操作用于设备
20、的异步通知操作设备的读写设备的读写字符设备的读写操作可以直接使用字符设备的读写操作可以直接使用readread和和writewrite函数来完成,函数来完成,块设备的读写,需要调用块设备的读写,需要调用block_readblock_read和和block_writeblock_write函数,这函数,这2 2个函数向设备请个函数向设备请求表中增加读写请求;求表中增加读写请求;块设备的读写是对内存缓冲区进行操作,如块设备的读写是对内存缓冲区进行操作,如果内存缓冲区中没有要读入的数据,或者缓果内存缓冲区中没有要读入的数据,或者缓冲区中的数据需要写入设备,可以通过调用冲区中的数据需要写入设备,可以
21、通过调用数据结构数据结构blk_dev_structblk_dev_struct中的函数中的函数request_fnrequest_fn完成。完成。设备的控制操作设备的控制操作对设备的控制操作可通过文件操作数据结构对设备的控制操作可通过文件操作数据结构中的中的ioctlioctl函数来完成。函数来完成。控制操作与具体的设备有密切关系,需要根控制操作与具体的设备有密切关系,需要根据设备实际情况进行具体分析。据设备实际情况进行具体分析。设备的轮询和中断处理设备的轮询和中断处理轮询方式轮询方式对于不支持中断的硬件设备,读写时需要对于不支持中断的硬件设备,读写时需要轮流查询设备的状态,以便决定随后的数
22、轮流查询设备的状态,以便决定随后的数据操作。据操作。如果轮询处理方式的驱动程序被链接到内如果轮询处理方式的驱动程序被链接到内核,则意味着查询过程中,内核一直处于核,则意味着查询过程中,内核一直处于闲置状态。闲置状态。解决方法是使用内核定时器,进行定期查解决方法是使用内核定时器,进行定期查询。询。设备的轮询和中断处理设备的轮询和中断处理中断处理方式中断处理方式硬件在需要的时候,向内核发出中断请求信号,硬件在需要的时候,向内核发出中断请求信号,而内核则负责把中断信号传递给相应的设备驱动。而内核则负责把中断信号传递给相应的设备驱动。驱动程序必须在设备驱动的初始化时申请中断资驱动程序必须在设备驱动的初
23、始化时申请中断资源,并注册中断处理函数:源,并注册中断处理函数:申请:申请:request_irqrequest_irqirq,irq_handler,irq,irq_handler,flag,dev_name,dev_idflag,dev_name,dev_id;释放:释放:free_irqfree_irqirq,dev_idirq,dev_id;其中其中irqirq为申请的中断线号,为申请的中断线号,irq_handlerirq_handler为注册为注册的中断处理函数,的中断处理函数,dev_id dev_id 用于共享中断信号线。用于共享中断信号线。典型字符驱动程序框架典型字符驱动程序
24、框架staticstructfile_operationsdemo_fops=read:demo_readwrite:demo_writeopen:demo_open;intinit_modulevoid returndemo_init;用于注册设备驱动、申请中断线,初始化等用于注册设备驱动、申请中断线,初始化等voidcleanup_modulevoiddemo_cleanup;用于注销设备驱动、释放中断线等用于注销设备驱动、释放中断线等接口函数的实现接口函数的实现Example1PXA270开发系统的按键驱动程开发系统的按键驱动程序与数码显示驱动序与数码显示驱动数码显示源代码数码显示源代码
25、按键驱动源代码按键驱动源代码调试驱动程序,使用调试驱动程序,使用调试驱动程序,使用调试驱动程序,使用printkprintk输出信息,信息的优先级依输出信息,信息的优先级依输出信息,信息的优先级依输出信息,信息的优先级依次为:次为:次为:次为:1.1.KERN_EMERGKERN_EMERG2.2.KERN_ALERTKERN_ALERT3.3.KERN_CRITKERN_CRIT4.4.KERN_ERRKERN_ERR5.5.KERN_WARNINGKERN_WARNING6.6.KERN_NOTICEKERN_NOTICE7.7.KERN_INFOKERN_INFO8.8.KERN_DEB
26、UGKERN_DEBUGn n如果要在终端输出信息,编译选项:如果要在终端输出信息,编译选项:如果要在终端输出信息,编译选项:如果要在终端输出信息,编译选项:-Wall O2-Wall O2n n根据根据根据根据/kernel/printk.c/kernel/printk.c的不同设置,不显示的信息会的不同设置,不显示的信息会的不同设置,不显示的信息会的不同设置,不显示的信息会出现在出现在出现在出现在/var/log/messages/var/log/messages中中中中n n驱动调试方法参见驱动调试方法参见驱动调试方法参见驱动调试方法参见Linux Device Drivers chap
27、ter 3Linux Device Drivers chapter 3帧缓冲设备驱动程序帧缓冲设备驱动程序LCD分类分类nLCD可由为液晶照明的方式有两种:传送式和反射式可由为液晶照明的方式有两种:传送式和反射式n传送式屏幕要使用外加光源照明,称为背光传送式屏幕要使用外加光源照明,称为背光backlight,照明光源要安装在,照明光源要安装在LCD的背后。传的背后。传送式送式LCD在正常光线及暗光线下,显示效果都很在正常光线及暗光线下,显示效果都很好,但在户外,尤其在日光下,很难辩清显示内好,但在户外,尤其在日光下,很难辩清显示内容。容。n反射式屏幕,则不需要外加照明电源,使用周围反射式屏幕,
28、则不需要外加照明电源,使用周围环境的光线或在某些笔记本中,使用前部照明环境的光线或在某些笔记本中,使用前部照明系统的光线。这样,反射式屏幕就没有背光,系统的光线。这样,反射式屏幕就没有背光,所以,此种屏幕在户外或光线充足的室内,才会所以,此种屏幕在户外或光线充足的室内,才会有出色的显示效果,但在一般室内光线下,这种有出色的显示效果,但在一般室内光线下,这种显示屏的显示效果就不及背光传送式的。显示屏的显示效果就不及背光传送式的。帧缓冲帧缓冲Framebuffern帧缓冲帧缓冲framebuffer显示缓冲区显示缓冲区n是是Linux为显示设备提供的一个接口,是为显示设备提供的一个接口,是把显存抽
29、象后的一种设备,他允许上层应把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进用程序在图形模式下直接对显示缓冲区进行读写操作。行读写操作。nXwindow绘制窗口,显示汉字都是通过绘制窗口,显示汉字都是通过fb帧缓冲设备帧缓冲设备nLinux可支持最多可支持最多32个个/dev/fb0/dev/fb31缺省是缺省是/dev/fb0n可以直接拷贝位图到可以直接拷贝位图到fb来显示到屏幕来显示到屏幕ncp /bitmap/penguin.bin /dev/fb0帧缓冲设备驱动原理帧缓冲设备驱动原理n帧缓冲设备属于字符设备,其目的就是通过帧缓冲设备属于字符设备,其目的就是通过配
30、置配置PXA270的存放器,在一段指定的内存与的存放器,在一段指定的内存与LCD之间建立一个自动传输的通道。这样,之间建立一个自动传输的通道。这样,任何程序只要修改这段内存中的数据,就可任何程序只要修改这段内存中的数据,就可以改变以改变LCD上的显示内容。上的显示内容。帧缓冲设备的文件操作层接口帧缓冲设备的文件操作层接口nstaticstructfile_operationsfb_fops=owner:THIS_MODULE,read:fb_read,/*读操作读操作*/write:fb_write,/*写操作写操作*/ioctl:fb_ioctl,/*控制操作控制操作*/mmap:fb_mm
31、ap,/*映射操作映射操作*/open:fb_open,/*翻开操作翻开操作*/release:fb_release,/*关闭操作关闭操作*/;其中的成员函数都在文件其中的成员函数都在文件linux/driver/video/fbmem.c中定义中定义 帧缓冲设备的文件操作层接口帧缓冲设备的文件操作层接口n控制操作函数控制操作函数fb_ioctl通过以下参数来传递通过以下参数来传递控制命令控制命令nFBIOGET_VSCREENINFOnFBIOPUT_VSCREENINFOnFBIOGET_FSCREENINFOn映射操作函数映射操作函数fb_mmapn将显示缓存映射到用户空间将显示缓存映射
32、到用户空间帧缓冲设备的驱动层接口帧缓冲设备的驱动层接口fb_infostructfb_infocharmodename;/*defaultvideomode*/charfontname;/*defaultfontname*/structfb_var_screeninfovar;/*Currentvar*/structfb_fix_screeninfofix;/*Currentfix*/structfb_ops*fbops;char*screen_base;/*Virtualaddress*/;帧缓冲设备的驱动层接口帧缓冲设备的驱动层接口fb_infonModename:设备名称;:设备名称;n
33、Fontname:显示字体;:显示字体;nfb_var_screeninfo:记录用户可修改的:记录用户可修改的显示控制器参数,包括屏幕分辨率和每个显示控制器参数,包括屏幕分辨率和每个像素点的比特数,其中的像素点的比特数,其中的xres定义屏幕一定义屏幕一行有多少个象素点行有多少个象素点,yres定义屏幕一列有多定义屏幕一列有多少个象素点,少个象素点,bits_per_pixel定义每个象定义每个象素点用多少个字节表示;素点用多少个字节表示;帧缓冲设备的驱动层接口帧缓冲设备的驱动层接口fb_infonfb_fix_screeninfo:记录用户不能修改的:记录用户不能修改的显示控制器的参数,如
34、屏幕缓冲区的物理显示控制器的参数,如屏幕缓冲区的物理地址,长度。当对帧缓冲设备进行映射操地址,长度。当对帧缓冲设备进行映射操作的时候,就是从作的时候,就是从fb_fix_screeninfo中取中取得缓冲区物理地址的。得缓冲区物理地址的。nFb_ops:指向底层操作的函数的指针;:指向底层操作的函数的指针;结构体结构体fb_info的定义的定义如何写帧缓冲设备驱动如何写帧缓冲设备驱动n n遵循设备驱动程序的结构,设备注册、定义遵循设备驱动程序的结构,设备注册、定义file_operations接口、初始化接口、初始化LCDC存放器存放器n n初始化一个初始化一个fb_info结构,填充其中的成
35、员结构,填充其中的成员变量,并调用变量,并调用register_framebuffer&fb_info,将,将fb_info登记入内核。登记入内核。n n实现定义的各个接口函数实现定义的各个接口函数帧缓冲驱动程序帧缓冲驱动程序初始化函数初始化函数n新的新的FB驱动程序,需要向驱动程序,需要向fbmem.cdrivers/video中的结构体中的结构体fb_drivers中添加相应的参数来给出初中添加相应的参数来给出初始化函数的入口。始化函数的入口。static struct const char*name;int*initvoid;int*setupchar*;fb_drivers _init
36、data=#ifdef CONFIG_FB_PXA pxa,pxafb_init,pxafb_setup,#endif帧缓冲驱动程序帧缓冲驱动程序初始化函数初始化函数ndbmx1fb_init的主要操作的主要操作n初始化相关的存放器初始化相关的存放器n初始化一个初始化一个fb_infofb_info结构,填充其中的成员变结构,填充其中的成员变量量n利用利用register_framebufferregister_framebuffer向内核注册向内核注册该设备。该设备。如何写帧缓冲的应用程序如何写帧缓冲的应用程序n在应用程序中,操作帧缓冲设备的一般步骤在应用程序中,操作帧缓冲设备的一般步骤如下
37、如下:1翻开翻开/dev/fb设备文件。设备文件。2用用ioctrl操作取得当前显示屏幕的参数,操作取得当前显示屏幕的参数,如屏幕分辨率,每个像素点的比特数。根如屏幕分辨率,每个像素点的比特数。根据屏幕参数可计算屏幕缓冲区的大小。据屏幕参数可计算屏幕缓冲区的大小。3将屏幕缓冲区映射到用户空间。将屏幕缓冲区映射到用户空间。4映射后就可以直接读写屏幕缓冲区,进映射后就可以直接读写屏幕缓冲区,进行绘图和图片显示行绘图和图片显示典型应用的代码结构典型应用的代码结构1intmainintfbfd=0;structfb_var_screeninfovinfo;structfb_fix_screeninfo
38、finfo;longintscreensize=0;/*翻开设备文件翻开设备文件*/fbfd=open/dev/fb0,O_RDWR;典型应用的代码结构典型应用的代码结构2/*取得屏幕相关参数取得屏幕相关参数*/ioctlfbfd,FBIOGET_FSCREENINFO,&finfo;ioctlfbfd,FBIOGET_VSCREENINFO,&vinfo;/*计算屏幕缓冲区大小计算屏幕缓冲区大小*/screensize=vinfo.xres*vinfo.yres*vinfo.bits_per_pixel/8;/*映射屏幕缓冲区到用户地址空间映射屏幕缓冲区到用户地址空间*/fbp=char*m
39、map0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fbfd,0;/*下面可通过下面可通过fbp指针读写缓冲区指针读写缓冲区*/帧缓冲设备的映射帧缓冲设备的映射mmapnFb设备驱开工作在内核空间,不允许用户应用设备驱开工作在内核空间,不允许用户应用程序直接访问程序直接访问fb物理地址物理地址nLinux在在fb设备驱动的设备驱动的file_operations结构中提结构中提供了供了mmap函数函数,将屏幕缓冲区的物理地址映射将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址到用户空间的一段虚拟地址,用户就可以通过用户就可以通过读写这段虚拟地址访问
40、屏幕缓冲区,在屏幕上读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图绘图 nfbp=char*mmap0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fbfd,0;帧缓冲设备的帧缓冲设备的ioctln帧缓冲设备,对设备文件的帧缓冲设备,对设备文件的ioctl操作可读取操作可读取/设置显示设备及屏幕的参数,如分辨率、设置显示设备及屏幕的参数,如分辨率、颜色数、幕大小等。颜色数、幕大小等。ioctl的操作是由底层的的操作是由底层的帧缓冲驱动程序来完成的。帧缓冲驱动程序来完成的。n/*取得屏幕相关参数取得屏幕相关参数*/ioctlfbfd,FBIOGET_FSC
41、REENINFO,&finfo;ioctlfbfd,FBIOGET_VSCREENINFO,&vinfo;一个帧缓冲应用例子一个帧缓冲应用例子nFb_test:利用帧缓冲设备画点,画线,填:利用帧缓冲设备画点,画线,填充区域,显示充区域,显示ascii字符,显示汉字字符,显示汉字FB_Test Example Coden9、静夜四无邻,荒居旧业贫。4月-234月-23Tuesday,April 18,2023n10、雨中黄叶树,灯下白头人。02:06:0802:06:0802:064/18/2023 2:06:08 AMn11、以我独沈久,愧君相见频。4月-2302:06:0802:06Apr
42、-2318-Apr-23n12、故人江海别,几度隔山川。02:06:0802:06:0802:06Tuesday,April 18,2023n13、乍见翻疑梦,相悲各问年。4月-234月-2302:06:0802:06:08April 18,2023n14、他乡生白发,旧国见青山。18 四月 20232:06:08 上午02:06:084月-23n15、比不了得就不比,得不到的就不要。四月 232:06 上午4月-2302:06April 18,2023n16、行动出成果,工作出财富。2023/4/18 2:06:0802:06:0818 April 2023n17、做前,能够环视四周;做时,
43、你只能或者最好沿着以脚为起点的射线向前。2:06:08 上午2:06 上午02:06:084月-23n9、没有失败,只有暂时停止成功!。4月-234月-23Tuesday,April 18,2023n10、很多事情努力了未必有结果,但是不努力却什么改变也没有。02:06:0802:06:0802:064/18/2023 2:06:08 AMn11、成功就是日复一日那一点点小小努力的积累。4月-2302:06:0802:06Apr-2318-Apr-23n12、世间成事,不求其绝对圆满,留一份缺乏,可得无限完美。02:06:0802:06:0802:06Tuesday,April 18,2023
44、n13、不知香积寺,数里入云峰。4月-234月-2302:06:0802:06:08April 18,2023n14、意志坚强的人能把世界放在手中像泥块一样任意揉捏。18 四月 20232:06:08 上午02:06:084月-23n15、楚塞三湘接,荆门九派通。四月 232:06 上午4月-2302:06April 18,2023n16、少年十五二十时,步行夺得胡马骑。2023/4/18 2:06:0802:06:0818 April 2023n17、空山新雨后,天气晚来秋。2:06:08 上午2:06 上午02:06:084月-23n9、杨柳散和风,青山澹吾虑。4月-234月-23Tues
45、day,April 18,2023n10、阅读一切好书如同和过去最杰出的人谈话。02:06:0802:06:0802:064/18/2023 2:06:08 AMn11、越是没有本领的就越加自命非凡。4月-2302:06:0802:06Apr-2318-Apr-23n12、越是无能的人,越喜欢挑剔别人的错儿。02:06:0802:06:0802:06Tuesday,April 18,2023n13、知人者智,自知者明。胜人者有力,自胜者强。4月-234月-2302:06:0802:06:08April 18,2023n14、意志坚强的人能把世界放在手中像泥块一样任意揉捏。18 四月 20232
46、:06:08 上午02:06:084月-23n15、最具挑战性的挑战莫过于提升自我。四月 232:06 上午4月-2302:06April 18,2023n16、业余生活要有意义,不要越轨。2023/4/18 2:06:0802:06:0818 April 2023n17、一个人即使已登上顶峰,也仍要自强不息。2:06:08 上午2:06 上午02:06:084月-23MOMODA POWERPOINTLorem ipsum dolor sit amet,consectetur adipiscing elit.Fusce id urna blandit,eleifend nulla ac,fringilla purus.Nulla iaculis tempor felis ut cursus.感感 谢谢 您您 的的 下下 载载 观观 看看专家告诉