- 550.50 KB
- 2022-04-29 14:28:53 发布
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
'第4章嵌入式Linux接口设计与驱动程序
第四章嵌入式Linux接口设计与驱动程序主要内容第一节驱动程序设计基础第二节AD接口驱动程序第三节直流电机驱动实验第四节触摸屏接口设计与驱动第五节显示接口与LinuxFrameBuffer(帧缓冲)第六节V4L程序设计第七节OSS程序设计
内容:一、Linux驱动程序简介二、开发驱动程序的方法三、设备驱动程序的分类四、主设备号和次设备号五、设备文件系统(devfs)与udevfs第一节驱动程序设计基础
大多数操作系统都把内核和运行在其上的应用程序分为两个层次进行管理,即“内核态”和“用户态”。内核态有较高的权限,可以控制处理器内存的映射和分配方式,访问外设空间和处理器的特殊状态寄存器,控制中断和DMA等;而用户态则只能运行应用程序。从用户态到内核态的切换通常可通过软件中断实现。在有MMU的处理器上,Linux系统把内核重新映射在3GB(即0xC0000000)以上的虚拟地址空间——内核空间;每个应用程序或进程都通过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等。在Linux2.4内核中引入了设备文件系统(devfs),所有的设备文件可以挂载到一个文件系统之中,这样就可以被文件系统进行统一管理。同时,命名规则也发生了变化,一般为主设备建立一个目录,再将具体的子设备文件建立在此目录下。第一节驱动程序设计基础——五、设备文件系统
值得注意的是,设备文件系统(devfs)在Linux2.6早期内核(Linux2.6.15以前的版本)中被标记为舍弃;在Linux2.6.15及以后的版本则取消了对它的支持。Linux2.6内核引入了系统文件系统(sysfs)为每个系统的硬件树进行分级管理,它提供设备的基本信息。同时使用udev脚本,这是一种Linux2.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转换有关参数
ARMS3C2410芯片自带一个8路10位AD转换器,并且支持触摸屏功能。ARM2410开发板只用了三路AD,通过查阅其数据手册,技术参数如下:分辨率:10位最大转换速率:500k非线性度:±1.5位低能耗电源电压:3.3V模拟输入范围:0~3.3VAD转换时间:当系统时钟为50MHz,且比例值为49,那么转换全部十位所用时间为:AD转换器频率=50MHz/(49+1)=1MHz转换时间=1/(1MHz/5cycles)=1/200kHz=5us14第二节AD接口驱动程序——三、ARM自带的AD转换装置
AD转换器在扩展板的连接15第二节AD接口驱动程序——三、ARM自带的AD转换装置
内容:一、直流电机PWM介绍二、直流电机的PWM原理三、PWMTIMER结构四、基于ARM的PWM相关寄存器五、关于程序实现第三节直流电机驱动实验16
随着社会的发展,各种智能化的产品走入寻常百姓家。为了实现产品的便携性、低成本以及对电源的限制,小型直流电机应用相当广泛。我们可以采用多种办法调节直流电机的速度。本节在给出直流电机调整和PWM实现方法的基础上,提供一种用软件实现PWM调速的方法。第三节直流电机驱动实验——一、直流电机PWM介绍17
晶体管的导通时间也被称为导通角а。改变调制晶体管的开关时间,即通过改变导通角а的大小,则可以改变负载上平均电压的大小,即因此改变对电机的变速控制(如图4-11所示),这种方法被称为脉宽调制变速控制(PWM)。在PWM变速控制中,系统采用直流电源,而且放大器的频率是固定的,变速控制只需要通过调节脉宽即可实现。第三节直流电机驱动实验——二、直流电机的PWM原理18
定时器输入时钟频率=PCLK/(预分频值+1)/(除值)第三节直流电机驱动实验——三、PWMTIMER结构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和预分频值,ClockSelect会产生一个属于自己的工作周期。按照上述的工作频率,计时器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.7~5V,参考电压Vref在1V至Vcc之间均可。转换器有4路模拟信号输入通道和独特的在线低阻开关,它允许由未选中的输入通道为外部线路提供电源和地。这样的输入结构能够极大地消除内部开关电阻带来的转换误差,而这种误差是这类转换器的主要误差来源。25第四节触摸屏接口设计与驱动——二、触摸屏驱动芯片ADS7843
S3C2410内置1个8信道的10位模数转换器(ADC),该ADC能以500KSPS的采样速率将外部的模拟信号转换为具有10位分辨率的数字量。同时ADC部分能与CPU的触摸屏控制器协同工作,完成对触摸屏绝对地址的测量。26第四节触摸屏接口设计与驱动——三、关于S3C2410芯片的触摸屏相关配置寄存器
内容:一、FrameBuffer机制介绍二、LCD简介第五节显示接口与LinuxFrameBuffer(帧缓冲)27
FrameBuffer是出现在2.2.xx之后版本的内核的一种驱动程序接口,是一种用来供用户态进程实现直接写屏的抽象设备。FrameBuffer可以看成是显存的一个映像,映射到进程地址空间中,不仅能够直接写屏,而且写操作可以立即在屏幕上显示出来。FrameBuffer操作是抽象的,其中物理显存和硬件结构都对用户透明,用户只需要通过应用程序直接读写FrameBuffer内容就可以完成对屏幕的显示控制。因此,FrameBuffer不具有运算和处理数据的能力,只负责进行数据传递。可见,FrameBuffer不是一个图形系统,只是一种机制的实现——可以简单地把内存中的数值映射到屏幕上去。也正因为如此,基于FrameBuffer的GUI具有高度的可移植性第五节显示接口与LinuxFrameBuffer(帧缓冲)——一、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:调色板信息。第五节显示接口与LinuxFrameBuffer(帧缓冲)——一、FrameBuffer机制介绍29
从缓冲帧操作集可以看到,关于FB的操作包括open、close、read、write、ioctl等,这些在之前的驱动程序中都做过介绍。内核通过fb_open()打开/dev/fb设备文件,之后通过fb_ioctl操作获得LCD的分辨率长宽和bpp等信息,并且通过mmap操作将其映射到用户空间之中。在这个过程中,可以通过fb_read和fb_write操作直接对FrameBuffer进行读写。在这里简单介绍一下mmap映射操作。mmap映射操作可以将设备内存直接映射到用户空间。对于帧缓冲设备,可以通过映射操作直接将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址之中。之后用户就可以通过读写这段虚拟地址来直接在屏幕上绘图。第五节显示接口与LinuxFrameBuffer(帧缓冲)——一、FrameBuffer机制介绍30
FrameBuffer的体系结构——集成了LCD控制器的嵌入式处理器体系结构S3C2410芯片设备将LCD控制器直接嵌入到处理器系统之中,也就是说,通过处理器通往外面的接口可以直接连接SDRAM和LCD。这为嵌入式系统开发板关于显示功能的扩展提供了直接接口,非常方便第五节显示接口与LinuxFrameBuffer(帧缓冲)——一、FrameBuffer机制介绍31
液晶显示器(LiquidCrystalDisplay)也简称为LCD,其构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。1、背光选择液晶显示器为被动发光型显示器,必须有外界光源,液晶显示器才会有显示。一般将液晶显示器分成透射式显示器、反射式显示器、半反半透式显示器三类。透射式液晶显示器必须加上背景光,反射式液晶显示器需要较强的环境光线,半反半透式液晶要求环境光线较强或加背光。2、LCD的驱动方式LCD的驱动方式有两种:使用LCD扫描芯片的LCD模块进行驱动,或者是通过LCD控制器直接扫描LCD屏幕。第五节显示接口与LinuxFrameBuffer(帧缓冲)——二、LCD简介32
3、S3C2410的LCD参数(1)STNLCD显示•支持三种LCD扫描模式:4位双扫描模式,4位单扫描模式,8位单扫描模式。•支持单色,4级灰度和16级灰度。•支持256色和4096色的彩色STNLCD(cstn)。•支持多种屏幕尺寸:支持的屏幕尺寸包括640x480、320x240、160x160等。虚拟屏幕最大尺寸为4M。虚拟屏幕在256色下的最大尺寸为4096x1024、2048x2048、1024x4096等。(2)TFT(薄膜场效应晶体管)LCD显示:•支持1、2、4、8位调色板彩色显示模式。•支持16位、24位非调色板真彩色显示模式。•支持最大为16M的24位模式。•支持多种屏幕尺寸。支持的屏幕尺寸包括640x480、320x240、160x160等。虚拟屏幕最大尺寸为4M。虚拟屏幕在64K颜色下的最大尺寸:2048x1024等。第五节显示接口与LinuxFrameBuffer(帧缓冲)——二、LCD简介33
S3C2410的LCD体系结构S3C2410自带的LCD控制器,用于传输视频数据(VD[23:0])和一些控制信号(VFRAME、VLINE、VCLK、VM等)。其中,VCLK表示像素时钟信号,VD[23: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等,然后通过VIDEOMUX把控制信息发送给LCD屏。第五节显示接口与LinuxFrameBuffer(帧缓冲)——二、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初始化的各种信息 。第五节显示接口与LinuxFrameBuffer(帧缓冲)——二、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中定义好了,通过该头文件,可以比较清晰地了解配置的含义,简化了相应的位操作。第五节显示接口与LinuxFrameBuffer(帧缓冲)——二、LCD简介36
内容:一、V4L概述二、V4L设备的体系结构第六节V4L程序设计37
V4L(VideoforLinux)是Linux下提供的一个音视频接口规范,所有的音视频设备的驱动编写都要用到这些接口。V4L的驱动程序videodev.c所在路径为内核存在目录的drivers/media/video路径下,而其依赖的头文件videodev.h位于内核存在目录的include/linux目录下。需要注意的是,v4l在2.6内核里同时支持两种版本,使用时需要区分开来。V4L所要用到的数据结构都在videodev.h中有定义,主要的数据结构如下所示:video_capability:包含摄像头的基本信息。video_window:包含设备采集窗口的各种信息。video_channel:视频通道信息。structvideo_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(OpenSoundSystem)是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_SPEEDIO控制命令可以设置采样频率。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'