收藏 分销(赏)

博创嵌入式培训PPT.ppt

上传人:仙人****88 文档编号:14096955 上传时间:2026-06-22 格式:PPT 页数:48 大小:516KB 下载积分:10 金币
下载 相关 举报
博创嵌入式培训PPT.ppt_第1页
第1页 / 共48页
博创嵌入式培训PPT.ppt_第2页
第2页 / 共48页


点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,4,章 嵌入式,Linux,接口设计与驱动程序,第四章 嵌入式,Linux,接口设计与,驱动程序,主要内容,第一节 驱动程序设计基础,第二节,AD,接口驱动程序,第三节 直流电机驱动实验,第四节 触摸屏接口设计与驱动,第五节 显示接口与,Linux,FrameBuffer,(帧缓冲),第六节,V4L,程序设计,第七节,OSS,程序设计,内容:,一、,Linux,驱动程序简介,二、开发驱动程序的方法,三、设备驱动程序的分类,四、主设备号和次设备号,五、设备文件系统(,devfs,)与,udevfs,第一节 驱动程序设计基础,大多数操作系统都把内核和运行在其上的应用程序分为两个层次进行管理,即“内核态”和“用户态”。内核态有较高的权限,可以控制处理器内存的映射和分配方式,访问外设空间和处理器的特殊状态寄存器,控制中断和,DMA,等;而用户态则只能运行应用程序。从用户态到内核态的切换通常可通过软件中断实现。,在有,MMU,的处理器上,,Linux,系统把内核重新映射在,3GB,(即,0 xC0000000,)以上的虚拟地址空间,内核空间;每个应用程序或进程都通过,MMU,建立独立寻址空间,用户空间。一个进程不可以(因为有,MMU,映射的保护)随便修改或访问另一个进程中的数据和代码。进程之间要进行数据交互,或者经过内核传递,或者通过内核映射共享内存。,第一节 驱动程序设计基础,一、,Linux,驱动程序简介,作为系统内核的一部分,驱动程序工作在内核态,而应用程序工作在用户态。也就是说,不能直接通过指针把用户空间的数据地址传递给内核(因为,MMU,映射的地址根本不一样)。要想在应用程序和驱动程序之间传递数据(指针),就要经过转换,把用户态“看”到的空间地址转换成内核态可访问的地址。,Linux,系统提供了一系列函数,可方便地实现这种转换,它们自己负责检查访问权限,使用时不需要考虑更多问题。,设备驱动程序应该只为系统的其他部分提供使用设备的能力,至于使用方法应该由应用程序来提供。也就是说,应用程序通过调用硬件设备对应的驱动程序来完成自己的目的,而调用什么,驱动程序则不需要知道。因此,在编写驱动程序时需要考虑下面三个方面:提供尽量多的选项给用户;提高驱动程序的速度和效率;尽量使驱动程序简单。,第一节 驱动程序设计基础,一、,Linux,驱动程序简介,一般来说,开发驱动程序有两种方法。一种方法是直接编译到内核,再运行新的内核来测试。这种方法虽然效率较低,但在某些场合是唯一的选择。第二种方法是编译为模块的形式,单独加载、运行、调试。这种方法不需要重新启动内核,只需要通过,insmod,和,rmmod,命令进行驱动模块增加和删减操作即可,使得驱动调试效率大大提高。,在编译内核的过程中,如上图所示可以看到编译过程中有三种选项:,M,表示编译成模块方式,,表示将其编译到内核之中,,如果没有选择则表示不编译该功能。,第一节 驱动程序设计基础,二、开发驱动程序的方法,Linux,内核一般把驱动程序分为,4,种类型:字符设备、块设备、网络设备以及不属于这三种设备类型的其它设备类型。其中,字符设备和块设备可以像文件一样被访问。例如,驱动程序通常会实现,open,、,close,、,read,、,write,或,seek,等操作。网络设备在,Linux,系统中是一类比较特殊的设备,它不像字符或块设备那样通过对应的设备文件节点访问,内核也不再通过,read,或,write,等调用去访问网络设备。,设备驱动程序是内核代码的一部分,其地址空间是内核的地址空间。应用程序通过操作系统的系统调用执行相应的驱动程序函数,中断则直接执行相应的中断程序代码。当设备驱动程序的,file_operations,结构体的地址被注册到内核中的设备链表中之后,块设备和字符设备以设备文件的方式建立在文件系统中的,/dev,目录下,而且每个设备都有一个主设备号和一个次设备号。,第一节 驱动程序设计基础,三、设备驱动程序的分类,在传统方式的设备管理中,除了设备类型外,内核还需要主次设备号两个参数,才能唯一标识某个设备。,如上图所示,在每一行的第一组中,第一个字母如果是,c,,表示该设备是字符设备;如果是,b,,表示该设备是块设备;如果是,d,,则表示是个目录。第一组的其他字母表示该设备的各种权限。第五组的数字表示主设备号,第六组数字表示次设备号。,例如,字符设备,audio1,和,audio,的主设备号都是,14,,而次设备号分别为,20,和,4,。,Linux,系统是靠主次设备号来联系驱动程序和设备文件节点的(而不是设备文件的路径)。系统依靠主设备号标识不同的驱动程序,在同一个系统中,一类设备的主设备号是唯一的,因此上例中,audio1,和,audio,使用同一个驱动程序。次设备号只是在驱动程序内部使用,系统内核直接把次设备号传递给驱动程序,由驱动程序管理。为了保证驱动程序的通用性,避免驱动程序移植过程中主设备号冲突,理想的方式是给每个设备驱动动态地分配主设备号。,第一节 驱动程序设计基础,四、主设备号和次设备号,设备类型、主次设备号是内核与设备驱动程序通信时所使用的,但是对于开发应用程序的用户来说难于理解和记忆,所以,Linux,使用设备文件的概念来统一对设备的访问接口。在引入设备文件系统(,devfs,)之前,,Linux,将设备文件放在,/dev,目录下,设备的命名一般为“设备文件名数字或字母表示的子类”,例如,/dev/hda1,、,/dev/hda2,等。,在,Linux 2.4,内核中引入了设备文件系统(,devfs,),所有的设备文件可以挂载到一个文件系统之中,这样就可以被文件系统进行统一管理,。同时,命名规则也发生了变化,一般为主设备建立一个目录,再将具体的子设备文件建立在此目录下。,第一节 驱动程序设计基础,五、设备文件系统,值得注意的是,设备文件系统(,devfs,)在,Linux 2.6,早期内核(,Linux 2.6.15,以前的版本)中被标记为舍弃;在,Linux 2.6.15,及以后的版本则取消了对它的支持。,Linux 2.6,内核引入了系统文件系统(,sysfs,)为每个系统的硬件树进行分级管理,它提供设备的基本信息。同时使用,udev,脚本,这是一种,Linux 2.6,内核采用的,/dev,目录管理系统。它能够在用户态动态地维护,/dev,目录下的设备文件。,第一节 驱动程序设计基础,五、设备文件系统,内容:,一、,AD,转换器,二、,AD,转换有关参数,三、,ARM,自带的,AD,转换装置,第二节,AD,接口驱动程序,10,AD,转换器的功能是将输入的模拟电压转换为数字信号输出。一个完整的,AD,转换过程必须包括采样、保持、量化、编码四部分。在具体实施时,常把这四个步骤合并进行。例如,采样和保持是利用同一电路连续完成的,量化和编码是在转换过程中同步实现的。,11,第二节,AD,接口驱动程序,一、,AD,转换器,模拟信号采样,为了使采样得到的离散模拟量与,n,位有限的,2n,个数字量进行对应,,还必须选取一个量化单位,将采样后离散的模拟量归并到,2n,个离散电平中的某一个电平上,这个过程称为量化。量化后的值再按数制要求进行编码,作为转换完成后输出的数字代码。量化和编码是所有,AD,转换器不可缺少的核心部分之一。,按转换过程,,AD,转换器可分为,直接型,AD,转换器,和,间接型,AD,转换器,。直接型,AD,转换器能把输入的模拟电压直接转换为输出的数字代码,而不需要经过中间变量。间接型,AD,转换器把待转换的输入模拟电压先转换为一个中间变量,然后再对中间变量量化编码,得出转换结果。,12,第二节,AD,接口驱动程序,一、,AD,转换器,AD,转换器的转换精度,在,AD,转换器中,经常用分辨率和转换误差来描述转换精度。分辨率是指引起输出二进制数字量最低有效位变动一个数码时,输入模拟量的最小变化量。输入模拟电压小于此最小变化量时,将不会引起输出数字量的变化。也就是说,,AD,转换器的分辨率反映了它对输入模拟量微小变化的分辨能力。显然,分辨率与输出的二进制数的位数有关,输出二进制数的位数越多,分辨率越小,分辨能力越高。,转换误差通常以相对误差的形式给出,它表示,AD,转换器实际输出的数字量与理想输出的数字量之间的差别,并用最低有效位(,LSB,)的倍数来表示。,AD,转换器的转换时间,转换时间表示完成一次从模拟量到数字量之间的转换所需要的时间,它反映了,AD,转换器的转换速度。,电源灵敏度,电源灵敏度表示,AD,转换芯片的供电电源的电压发生变化时所产生的转换误差。,量程,量程是所能转换的模拟输入电压范围。,13,第二节,AD,接口驱动程序,二、,AD,转换有关参数,ARM S3C2410,芯片自带一个,8,路,10,位,AD,转换器,并且支持触摸屏功能。,ARM2410,开发板只用了三路,AD,,通过查阅其数据手册,技术参数如下:,分辨率:,10,位,最大转换速率:,500k,非线性度:,1.5,位,低能耗,电源电压:,3.3V,模拟输入范围:,0,3.3V,AD,转换时间:当系统时钟为,50MHz,,且比例值为,49,,那么转换全部十位所用时间为:,AD,转换器频率,=50 MHz/(49+1)=1 MHz,转换时间,=1/(1 MHz/5cycles)=1/200 kHz=5 us,14,第二节,AD,接口驱动程序,三、,ARM,自带的,AD,转换装置,AD,转换器在扩展板的连接,15,第二节,AD,接口驱动程序,三、,ARM,自带的,AD,转换装置,内容:,一、直流电机,PWM,介绍,二、直流电机的,PWM,原理,三、,PWM TIMER,结构,四、基于,ARM,的,PWM,相关寄存器,五、关于程序实现,第三节 直流电机驱动实验,16,随着社会的发展,各种智能化的产品走入寻常百姓家。为了实现产品的便携性、低成本以及对电源的限制,,小型直流电机应用相当广泛。我们可以采用多种办法调节直流电机的速度。本节在给出直流电机调整和,PWM,实现方法的基础上,提供一种用软件实现,PWM,调速的方法。,第三节 直流电机驱动实验,一、直流电机,PWM,介绍,17,晶体管的导通时间也被称为导通角,。改变调制晶体管的开关时间,即通过改变导通角,的大小,则可以改变负载上平均电压的大小,即因此改变对电机的变速控制(如图,4-11,所示),这种方法被称为脉宽调制变速控制,(PWM),。在,PWM,变速控制中,系统采用直流电源,而且放大器的频率是固定的,变速控制只需要通过调节脉宽即可实现。,第三节 直流电机驱动实验,二、直流电机的,PWM,原理,18,定时器输入时钟频率,=PCLK/,(预分频值,+1,),/(,除值,),第三节 直流电机驱动实验,三、,PWM TIMER,结构,19,S3C2410X,有五个,16,位的定时器。定时器,0,、,1,、,2,、,3,具有,PWM,功能,定时器,4,没有输出引脚。其中,定时器,0,有一个死区发生器。定时器,0,和定时器,1,使用一个,8,位的预分频值,定时器,2,、,3,、,4,使用另外一个,8,位的预分频值。每个定时器都拥有一个时钟除法器,其中包括五个不同的除值信号(,1/2,、,1/4,、,1/8,、,1/16,和,TCLK,)。每个定时器都可以从时钟除法器中接收它的时钟信号,而时钟除法器则从,8,位的预刻度器中接收时钟。,8,位的预刻度器可以编程,并且通过装载的数值对,PCLK,进行除操作。这些信息都保存在,TCFG0,和,TCFG1,寄存器中。,第三节 直流电机驱动实验,四、基于,ARM,的,PWM,相关寄存器,20,程序首先初始化系统时钟。使用,TCON,打开定时器,0,,,PCLK=FCLK/4=203M/4=50.7MHz,。预分频值默认为,0,,调整到,2,。除法器的默认值为,0,,即表示,1/2,。此时定时器时钟输入频率为,PCLK/,(预分频值,+1,),/(,除值,),。,PCLK,是,s3c2410,的唯一时钟信号源,之后根据,PCLK,和预分频值,,Clock Select,会产生一个属于自己的工作周期。,按照上述的工作频率,计时器,0,的初始值,TCNTB0,设为,16384,(低于,10ms,),,TCMPB0,的默认值为,TCNTB0/2,。依靠两者之间的比值,改变电机的转速。,第三节 直流电机驱动实验,五、关于程序实现,21,内容:,一、触摸屏的工作原理,二、触摸屏驱动芯片,ADS7843,三、关于,S3C2410,芯片的触摸屏相关配置寄存器,第四节 触摸屏接口设计与驱动,22,在开发平台,UP-NETARM2410S,上使用的是电阻式触摸屏。电阻式触摸屏通常采用薄膜加上玻璃的结构。当触摸屏薄膜下层的,ITO,(纳米铟锡金属氧化物,一种导电物质)接触到玻璃上层的,ITO,时,相应的感应器就会传出一个信息,再从控制器送到计算机端,之后再通过驱动程序转化为屏幕上对应的坐标值。,一般来说,电阻触摸屏分为四线电阻和五线电阻触摸屏。在该开发板上使用的是四线触摸屏。四线电阻模拟量技术的两层透明金属层工作时每层均增加,5V,恒定电压:一个竖直方向,一个水平方向,总共需四根电缆。,23,第四节 触摸屏接口设计与驱动,一、触摸屏的工作原理,接触屏幕时,两个,ITO,导电层出现一个接触点,因其中一面导电层接通,Y,轴方向的,5V,均匀电压场,使得侦测层的电压由零变为非零。控制器侦测到这个接通后,进行,A/D,转换,并将得到的电压值与,5V,相比,即可得触摸点的,Y,轴坐标,同理得出,X,轴的坐标,这就是电阻技术触摸屏的基本工作原理,24,第四节 触摸屏接口设计与驱动,一、触摸屏的工作原理,在该实验平台,UP-NETARM2410S,上所使用的触摸屏芯片是触摸屏驱动芯片,ADS7843,。,ADS7843,是专用于,4,线电阻式触摸屏的,12,位模,/,数采样转换器,它具有一个串口接口,以及面向连接触摸屏的相关接口。,ADS7843,具有单一电源供电、完全降功耗模式、转换速度快的特点。,ADS7843,的工作电压,Vcc,为,2.75V,,参考电压,Vref,在,1V,至,Vcc,之间均可。转换器有,4,路模拟信号输入通道和独特的在线低阻开关,它允许由未选中的输入通道为外部线路提供电源和地。这样的输入结构能够极大地消除内部开关电阻带来的转换误差,而这种误差是这类转换器的主要误差来源。,25,第四节 触摸屏接口设计与驱动,二、触摸屏驱动芯片,ADS7843,S3C2410,内置,1,个,8,信道的,10,位模数转换器(,ADC,),该,ADC,能以,500KSPS,的采样速率将外部的模拟信号转换为具有,10,位分辨率的数字量。同时,ADC,部分能与,CPU,的触摸屏控制器协同工作,完成对触摸屏绝对地址的测量。,26,第四节 触摸屏接口设计与驱动,三、关于,S3C2410,芯片的触摸屏相关配置寄存器,内容:,一、,FrameBuffer,机制介绍,二、,LCD,简介,第五节 显示接口与,Linux,FrameBuffer,(帧缓冲),27,FrameBuffer,是出现在,2.2.xx,之后版本的内核的一种驱动程序接口,是一种用来供用户态进程实现直接写屏的抽象设备。,FrameBuffer,可以看成是显存的一个映像,映射到进程地址空间中,不仅能够直接写屏,而且写操作可以立即在屏幕上显示出来。,FrameBuffer,操作是抽象的,其中物理显存和硬件结构都对用户透明,用户只需要通过应用程序直接读写,FrameBuffer,内容就可以完成对屏幕的显示控制。因此,,FrameBuffer,不具有运算和处理数据的能力,只负责进行数据传递。,可见,,FrameBuffer,不是一个图形系统,只是一种机制的实现,可以简单地把内存中的数值映射到屏幕上去。也正因为如此,基于,FrameBuffer,的,GUI,具有高度的可移植性,第五节 显示接口与,Linux,FrameBuffer,(帧缓冲),一、,FrameBuffer,机制介绍,28,1,,,FrameBuffer,的实现,FrameBuffer,对应的源文件位于,linux,/drivers/video,目录中,除了总抽象设备文件,fbcon.c,之外,其设备驱动主要,fbmem.c,文件之中有所描述,。,fbmem.c,是,FrameBuffer,机制的驱动程序,也是,FrameBuffer,机制的核心文件,它为上层的应用程序提供通用的接口,同时也为下一层的特定硬件提供接口。其中的函数操作具体的硬件,设置寄存器,对显示缓冲进行映射。该程序的具体说明如下:,首先,该程序有大量的关于设备的宏定义,之后用,fb.h,中包含的结构体定义了几个变量(,fb.h,位于,/opt/host/armv4l/include/linux,目录中)。涉及的主要结构体包括:,fb_var_screeninfo,:记录帧缓冲设备和指定显示模式的可修改记录,包括屏幕的分辨率、像素信息和一些时序变量。,fb_fix_screeninfo,:记录帧缓冲设备和指定显示模式的不可修改记录,包含屏幕缓冲区的物理地址和长度。,fb_info,:,linux,为帧缓冲设备定义的驱动层接口。,fb_cmap,:调色板信息。,第五节 显示接口与,Linux,FrameBuffer,(帧缓冲),一、,FrameBuffer,机制介绍,29,从缓冲帧操作集可以看到,关于,FB,的操作包括,open,、,close,、,read,、,write,、,ioctl,等,这些在之前的驱动程序中都做过介绍。内核通过,fb_open,(),打开,/dev/,fb,设备文件,之后通过,fb_ioctl,操作获得,LCD,的分辨率长宽和,bpp,等信息,并且通过,mmap,操作将其映射到用户空间之中。在这个过程中,可以通过,fb_read,和,fb_write,操作直接对,FrameBuffer,进行读写。在这里简单介绍一下,mmap,映射操作。,mmap,映射操作可以将设备内存直接映射到用户空间。对于帧缓冲设备,可以通过映射操作直接将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址之中。之后用户就可以通过读写这段虚拟地址来直接在屏幕上绘图。,第五节 显示接口与,Linux,FrameBuffer,(帧缓冲),一、,FrameBuffer,机制介绍,30,FrameBuffer,的体系结构,集成了,LCD,控制器的嵌入式处理器体系结构,S3C2410,芯片设备将,LCD,控制器直接嵌入到处理器系统之中,也就是说,通过处理器通往外面的接口可以直接连接,SDRAM,和,LCD,。这为嵌入式系统开发板关于显示功能的扩展提供了直接接口,非常方便,第五节 显示接口与,Linux,FrameBuffer,(帧缓冲),一、,FrameBuffer,机制介绍,31,液晶显示器(,Liquid Crystal Display,)也简称为,LCD,,其构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。,1,、背光选择,液晶显示器为被动发光型显示器,必须有外界光源,液晶显示器才会有显示。一般将液晶显示器分成透射式显示器、反射式显示器、半反半透式显示器三类。透射式液晶显示器必须加上背景光,反射式液晶显示器需要较强的环境光线,半反半透式液晶要求环境光线较强或加背光。,2,、,LCD,的驱动方式,LCD,的驱动方式有两种:使用,LCD,扫描芯片的,LCD,模块进行驱动,或者是通过,LCD,控制器直接扫描,LCD,屏幕。,第五节 显示接口与,Linux,FrameBuffer,(帧缓冲),二、,LCD,简介,32,3,、,S3C2410,的,LCD,参数,(,1,),STN LCD,显示,支持三种,LCD,扫描模式,:4,位双扫描模式,,4,位单扫描模式,,8,位单扫描模式。,支持单色,4,级灰度和,16,级灰度。,支持,256,色和,4096,色的彩色,STN LCD,(,cstn,)。,支持多种屏幕尺寸:支持的屏幕尺寸包括,640 x480,、,320 x240,、,160 x160,等。虚拟屏幕最大尺寸为,4M,。虚拟屏幕在,256,色下的最大尺寸为,4096x1024,、,2048x2048,、,1024x4096,等。,(,2,),TFT,(薄膜场效应晶体管),LCD,显示:,支持,1,、,2,、,4,、,8,位调色板彩色显示模式。,支持,16,位、,24,位非调色板真彩色显示模式。,支持最大为,16M,的,24,位模式。,支持多种屏幕尺寸。支持的屏幕尺寸包括,640 x480,、,320 x240,、,160 x160,等。虚拟屏幕最大尺寸为,4M,。虚拟屏幕在,64K,颜色下的最大尺寸:,2048x1024,等。,第五节 显示接口与,Linux,FrameBuffer,(帧缓冲),二、,LCD,简介,33,S3C2410,的,LCD,体系结构,S3C2410,自带的,LCD,控制器,用于传输视频数据(,VD23:0,)和一些控制信号,(VFRAME,、,VLINE,、,VCLK,、,VM,等,),。其中,,VCLK,表示像素时钟信号,,VD23:0,表示,LCD,像素输出端口,,VM/VDEN/TP,表示,LCD,驱动器的,ac,偏置信号,,VSYNC,表示帧同步信号,,HSYNC,表示行同步信号。在转换器中,,REGBANK,是,LCD,的寄存器组,用来设置,LCD,的各个参数。,LCDCDMA,是,LCD,的,DMA,通道,能够从系统总线取得视频资料。之后它通过,VIDPRCS,从,VD,端口向,LCD,屏发送数据。另外,,TIMEGEN,和,LPC3600,用来产生,LCD,屏所需要的各种控制时序,包括,VSYNC,、,HSYNC,、,VCLK,、,VDEN,等,然后通过,VIDEO MUX,把控制信息发送给,LCD,屏。,第五节 显示接口与,Linux,FrameBuffer,(帧缓冲),二、,LCD,简介,34,4,,,S3C2410,的,LCD,扫描模式,S3C2410,有多种扫描方式,我们在本章的样例程序里面所用的是,16,位的,565,扫描方式,.,如图可知,某一点的颜色是使用,16,位进行表示的,其中红绿蓝分别占用,5,、,6,、,5,位。按照这,16,位颜色进行组合,得到该点的颜色值,对于,32,位,可能为,8,、,8,、,8,、,结构,不同的彩色空间与颜色深度存在一些转换上的差异。,在头文件,S3c2410fb.h,(,driver/video,)中,定义了几个相关的结构体。其中,,s3c2410fb_rgb,表示像素点的颜色值;,s3c2410fb_lcd_reg,用来提供,LCD,的相关寄存器值来控制,LCD,;,s3c2410fb_mach_info,和,s3c2410fb_info,则提供了,LCD,的相关信息。以上这几个结构体用来辅助同目录下的程序,S3c2410fb.c,(,driver/video,)。在该程序中定义了,_,initdata,结构体,这个结构体表征了,LCD,初始化的各种信息。,第五节 显示接口与,Linux,FrameBuffer,(帧缓冲),二、,LCD,简介,35,5,,关于,LCD,寄存器,S3C2410,关于,LCD,的寄存器主要包括,5,个控制寄存器以及,3,个缓冲帧始地址寄存器,LCD,寄存器的配置信息如下:,lcdcon1:LCD1_BPP_16T|LCD1_PNR_TFT|LCD1_CLKVAL(1),lcdcon2:LCD2_VBPD(32)|LCD2_VFPD(9)|LCD2_VSPW(1),lcdcon3:LCD3_HBPD(47)|LCD3_HFPD(15),lcdcon4:LCD4_HSPW(95)|LCD4_MVAL(13),lcdcon5:LCD5_FRM565|LCD5_INVVLINE|LCD5_INVVFRAME|LCD5_HWSWP|LCD5_PWREN,因此在,LCD,的以上配置选项当中,我们可以知道,lcdcon,都进行了哪些配置。其中大量的宏定义都在,S3C2410.H,中定义好了,通过该头文件,可以比较清晰地了解配置的含义,简化了相应的位操作。,第五节 显示接口与,Linux,FrameBuffer,(帧缓冲),二、,LCD,简介,36,内容:,一、,V4L,概述,二、,V4L,设备的体系结构,第六节,V4L,程序设计,37,V4L(Video for Linux),是,Linux,下提供的一个音视频接口规范,所有的音视频设备的驱动编写都要用到这些接口。,V4L,的驱动程序,videodev.c,所在路径为内核存在目录的,drivers/media/video,路径下,而其依赖的头文件,videodev.h,位于内核存在目录的,include/,linux,目录下。,需要注意的是,,v4l,在,2.6,内核里同时支持两种版本,使用时需要区分开来。,V4L,所要用到的数据结构都在,videodev.h,中有定义,主要的数据结构如下所示:,video_capability,:包含摄像头的基本信息。,video_window,:包含设备采集窗口的各种信息。,video_channel,:视频通道信息。,struct,video_picture,:包含设备采集图像的各种属性。,video_audio,:,音频数据结构,video_mmap,:,用于内存映射。,video_mbuf,:,利用,mmap,进行映射的帧信息。,第六节,V4L,程序设计,一、,V4L,概述,38,2410,核心板外接,USB,摄像头,通过,OV511,的感光芯片获取视频数据,并在,16bit,的,LCD,显示屏上显示采集到的视频,不同摄像头和,LCD,,其颜色深度和分辨率需要值得注意。,第六节,V4L,程序设计,二、,V4L,设备的体系结构,39,内容:,一、,OSS,概述,二、,OSS,设备的体系结构,三、,OSS,驱动分析,四、,OSS,用户空间编程,第七节,OSS,程序设计,40,OSS(Open,Sound System),是,Linux,上的音频编程接口,它由一套完整的内核驱动程序模块组成,可为大多数声卡提供统一的编程接口。,OSS,标准中有,2,个基本的音频设备:,Mixer,(混音器)和,DSP,(数字信号处理器)。,Mixer,的作用是将多个信号组合叠加在一起,其最简单的功能就是控制输入,/,输出音量的大小。在,OSS,驱动中,,/dev/sound/mixer,设备文件是应用程序对,mixer,进行操作的软件接口。,DSP,也称为编解码器,用于实现录音和放音,其对应的设备文件是,/dev/sound/,dsp,。,OSS,声卡驱动程序提供的,/dev/sound/,dsp,是用于数字采样和数字录音的设备文件,向该设备写数据则激活,D/A,转换器进行放音,而向该设备读数据则激活声卡上的,A/D,转换器进行录音。,第七节,OSS,程序设计,一、,OSS,概述,41,S3C2410,采用,UDA1341TS,音频芯片,与,S3C2410,芯片的连接如图,4-32,所示,从图可以看出,在这个体系结构中,为了实现全双工,数据传输使用两个,DMA,通道。,第七节,OSS,程序设计,二、,OSS,设备的体系结构,42,DSP,设备驱动包括的方法主要有,open(),、,release(),、,read(),、,write(),、,poll(),、,ioctl,(),。其中,在,write(),和,read(),方法中实现对声音的播放和录音。在,Linux,应用程序中,通过对,DSP,设备文件节点的写入,就可以实现声音的播放,对应的方法是,open(),和,write(),。,第七节,OSS,程序设计,三、,OSS,驱动分析,43,对,OSS,驱动声卡的编程使用,Linux,文件接口函数,第七节,OSS,程序设计,四、,OSS,用户空间编程,44,1,)打开设备文件,/dev/sound/,dsp,。,Linux,允许应用程序多次打开或者关闭与声卡对应的设备文件,从而能够方便地在放音状态和录音状态之间进行切换。,2,)设置缓冲区大小。运行在,Linux,内核中的声卡驱动程序专门维护了一个缓冲区,其大小会影响放音和录音时的效果,使用,ioctl,(),系统调用可以对它的尺寸进行恰当的设置。,3,)设置声道(,channel,)数量。根据硬件设备和驱动程序的具体情况,可以设置为单声道或者立体声。,4,)设置采样格式和采样频率。在,Linux,下进行音频编程时使用,SNDCTL_DSP_SPEED IO,控制命令可以设置采样频率。,5,)读写,/dev/sound/,dsp,实现播放或录音。使用,write(),和,read(),方法中实现对声音的播放和录音,第七节,OSS,程序设计,四、,OSS,用户空间编程,45,本章主要讲述嵌入式,Linux,的接口设计以及驱动程序,在虚拟驱动程序的框架基础上,阐述了,AD,、直流电机、触摸屏、,FrameBuffer,、视频设备和音频设备多个硬件的驱动程序和相关测试程序,理解驱动程序的框架、阅读与理解相关的代码是本章的重点与难点,本章的驱动程序设计实现是基于,Linux,内核,2.4,版本的,对于,2.6,版本存在差异,读者可以在这些程序的思路上进行修改,从而使用相关代码。,小结,46,1.,请列举出开发驱动程序的方法以及驱动程序的分类。,2.,请列举出使用,devfs,和不使用,devfs,编译驱动程序的区别。,3.,请列举出驱动程序和应用程序之间的区别。,4.,请列举出驱动程序的结构。,5.,请完成使用模数转换设备控制直流电机的实验。,6.,请完成使用,FrameBuffer,机制的实验。,7.,请完成使用触摸屏的实验。,8.,请完成使用,V4L,的相关实验。,9.,请完成使用,OSS,的相关实验。,10.,请完成本章的综合实验。,习题,47,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服