1 设备驱动双层模型
类驱动(class
微型驱动(mini-driver):类驱动使用一个具体设备特有的微型驱动来对一个特定的设备进行应用程序软件所需要的操作。
微型驱动的开发者必须具有将一个特定设备有效地呈现给类驱动的能力,例如一个视频显示设备可能要拥有一个由应用程序分为其分配的帧缓冲区来有效的执行所需要的I/O操作。并且一个视频类驱动可能需要使用一系列不连续的帧缓冲区来代表一个发往微型驱动的I/O请求-这些不连续的帧缓冲区可能用于存放RGB或YUV分量-这样才能使下层的微型驱动能够有效地与视频硬件互动。
一个有效的驱动模型应该能够采用I/O请求包的形式来有效地代表一个发往微型驱动的I/O请求,即将请求信息包含在驱动开发者定义的一个架构体中。
1
DSP/BIOS目前定义了三种类型的类驱动,分别是PIP/PIO、SIO/DIO和GIO。对于PIP/PIO和SIO/DIO类驱动,应用程序调用的API函数就是DSP/BIOS中现有的PIP/SIO函数,这些API与相应的适配器(PIO或DIO)进行交互,而适配器则直接与微型驱动进行通信。使用GIO类驱动时,应用程序则调用一套新的GIO/API函数直接与微型驱动通信。
在一个应用程序中可能同时存在多种类型的类驱动,应用程序开发者可以选择在一个系统中使用一种或是多种类型驱动。而类型驱动程序开发人员不必编写类驱动,每个微型驱动都提供一套标准的微型驱动接口函数,供类驱动使用以访问该外围设备,以及供DSP/BIOS使用来管理设备驱动。微型驱动利用芯片支持库CSL来访问外围设备寄存器、存储器和中断源。一些微型驱动还可以根据需要包含一个特有的子驱动。
2
双层设备驱动模型包括两种类型的对象实例:
设备实例:这是对于实际的外围设备(如一个音频codec或视频端口)的抽象。设备实例需要被注册到DSP/BIOS的设备表中。应用程序通过设备实例的逻辑名称来引用它们。如果配置了多个设备实例,那么在设备表中每一个实例都具有一个唯一的逻辑名称。
通道实例:这是对应用程序与设备实例之间通信路径的抽象。通过调用微型驱动的mdCreateChan函数可以创建通道实例。
2设备驱动数据流
1.
在应用程序和设备之间的通信开始之前,应用程序必须得到一个由微型驱动的mdCreateChan函数返回的通道实例句柄。
每个通道实例占用的资源数量(如存储器空间)取决于微型驱动以及适配器对该通道的实现方式。一个通道对象通常会维护一些与通道模式、I/O请求队列和驱动状态信息有关的数据域。因此每个通道实例所需存储空间的总量会由于适配器以及微型驱动实现方式的不同而有所不同。
3 类驱动概述
DSP/BIOS支持两种数据传送模型:一种是由SIO模块实现的流传输模型,另一种是由PIP模块实现的管道模型。这两种传输模型具有以下几个特点:
l
l
l
这两种传输模型都可以通过相应的适配器和IOM微驱动模型进行连接。
3.1
SIO适配器亦称DIO,是为了方便地将流和IOM微型驱动结合起来而设计的。两者之间的通信和同步是以最小的开销和复杂度实现的。DIO适配器使用以下两种基本类型的函数进行应用程序和微型驱动之间的通信。
传输函数(transfer
3.2
DSP/BIOS
一个管道有两个端口:写入端(程序向管道里写入数据帧)和读取端(程序从管道里读出数据帧)。典型情况下其中一端是一个调用某I/O设备的函数。
数据通知函数用于对数据传输进行同步,当一帧数据写入管道或从管道读取后都会触发通知函数以通知PIP的另一端有一个满帧或空帧可用。
4
4.1
为在DSP/BIOS应用程序中注册并使用一个IOM微型驱动,用户必须配置应用程序使用该微型驱动。该配置过程是静态完成的,通过DSP/BIOS配置工具或者通过一个DSP/BIOS
4.2 GIO模块
l
l
l
l
l
l
对GIO接口的扩展还能够被更“友好”和有效地用于视频捕获及显示驱动。例如这种扩展可以满足视频设备存储区分配(如专门的帧缓冲区)的需要。另外,在提供了视频驱动和应用程序之间的视频数据同步机制之后,这种扩展也能够允许使用一个单独的调用来“交换”视频缓冲区。
GIO模块的一个重要特点是能够扩展额外的API函数以支持新的应用领域。本节将给出为支持视频应用而实现的一个GIO类驱动API扩展的示例。和使用现有的SIO或PIP
1
2
3