vxWorks设备驱动开发指南(2)

2019-04-21 16:07

vxWroks 6.8设备驱动开发指南

——写具体类设备驱动

3 DMA驱动

3.1 简介

本章描述了DMA驱动。

3.2 概要

有些硬件设计包括一个通用DMA引擎,处理来自DMA的访问,或到外部设备,或从内存到内存。这些DMA引擎通常集成在片上CPU系统中。DMA驱动类为系统中其它设备提供DMA引擎服务的一套标准方法。

提供的vxbDmaLib库提供用于DMA引擎。这个DMA库提供的函数是vxbDmaChanAlloc( )和vxbDmaChanFree( )。

3.3 VxBus驱动方法

由vxbDmaLib库提供的函数充分使用三个VxBus驱动方法:

■?

{vxbDmaResourceGet}( ) {vxbDmaResourceRelease}( ) {vxbDmaResDedicatedGet}( )

■?

■?

DMA驱动通过这些方法的关联函数提供对它们服务的访问。

3.3.1 {vxbDmaResourceGet}( )

{vxbDmaResourceGet}( )方法用于DMA库来分配一个DMA驱动管理的设备上的DMA通道。原型如下:

STATUS {vxbDmaResourceGet} (

VXB_DEVICE_ID pInst, VXB_DEVICE_ID pReqDev, VXB_DMA_REQUEST * pReq )

这个原型,pInst指DAM设备本身,pReqDev指请求一个DMA通道的设备,和pReq是一个指针,指向一个结构,描述DMA通道的期望的属性。

VXB_DMA_REQUEST结构定义在:

installDir/vxworks-6.x/target/src/hwif/h/util/vxbDmaDriverLib.h

结构定义如下:

typedef struct vxbDmaRequest {

VXB_DEVICE_ID instance; /* DMA requestor device id */ UINT32 minQueueDepth; /* minimum queue depth requested */

UINT32 flags; /* flags used during DMA allocation */

VXB_DMA_RESOURCE_ID pChan; /* DMA channel id */ void * pDedicatedChanInfo; /* dedicated channel information */ } VXB_DMA_REQUEST;

这个结构很大程度上对应传递给vxbDmaChanAlloc( )的参数。DMA设备驱动正常选择一个基于minQueueDepth和flags DMA通道,并返回指向通道的指针pChan。设备驱动调用DMA驱动的通道分配代码——无论通过和函数——可以有选择的传递一个执行一个结构的指针,这个指针包括具体于期望DMA通道的信息,专有于请求者。DMA驱动可以充分使用这个信息来设置一个专有的DMA通道。

3.3.2 {vxbDmaResourceRelease}( )

{vxbDmaResourceRelease}( )方法用于DMA库来释放DMA驱动管理的设备上的DMA通道。原型如下:

STATUS {vxbDmaResourceRelease} (

VXB_DEVICE_ID pInst, VXB_DMA_RESOURCE_ID pChan )

大多数情况下,驱动的仅有要求是释放具体的分配给设备的DMA通道,由pChan标识,pInst指向DMA设备的VxBus设备ID。

3.3.3 {vxbDmaResDedicatedGet}( )

DMA库使用{vxbDmaResDedicatedGet}( )方法来分配一个DMA方法专属于调用方法的具体设备。这个方法的功能和{vxbDmaResourceGet}( )类似。然而,制约于硬件限制或其他限制,你可能想使用这个设备来保证具体设备分配给具体通道。如这通过检查设备名关联的设备实例,由pReqDev标识,来完成,或检查使用的成员传递pReq的pDedicatedChanInfo信息。原型如下:

STATUS {vxbDmaResDedicatedGet} (

VXB_DEVICE_ID pReqDev, VXB_DMA_REQUEST * pReq )

3.4 头文件

DMA驱动必须包含如下头文件:

#include #include \

其他驱动想使用vxbDmaLib可能需要包含如下: #include

这些驱动也可能需要包含具体DMA驱动的头文件,为了使用专用的通道功能。

3.5 BSP配置

DMA驱动通常BSP不需要什么配置信息。参考VxWorks Device Driver Developer’s Guide (Vol.1): Device Driver Fundamentals。

3.6 可用的工具函数

DMA驱动不需要什么具体类工具函数。

3.7 初始化

DMA设备驱动的初始化通常是具体于设备的。初始化应该在VxBus初始化阶段2前或期间完成,所以其他设备驱动可以在初始化阶段3使用vxbDmaLib库。

3.8 DMA系统结构和函数

前面部分描述的函数和方法充分使用VXB_DMA_RESOURCE_ID来标识一个具体的DMA通道。这个标识是一个指向vxbDmaResource结构的指针,定义如下:

struct vxbDmaResource {

struct vxbDmaFuncs dmaFuncs;/* structure holding dma function pointers */

void * pDmaChan;/* channel specific data-used by DMA driver */

VXB_DEVICE_ID dmaInst; /* dma engine instance ID */ };

这个结构的dmaFuncs成员包含用于不同DMA操作的函数指针。设备驱动可以通过VXB_DMA_RESOURCE_ID标识访问这些函数,调用vxbDmaChanAlloc( )函数返回给他们。这些函数指针应用被DMA驱动填充。依据传递给vxbDmaChanAlloc( )函数的flags参数,vxbDmaLib可能初始化读写函数。vxbDmaFuncs结构定义在vxbDmaLib.h中,包含指向如下部分描述的函数指针。

3.8.1 (*dmaRead)( )

(*dmaRead)( )顺序从设备的缓存或寄存器中读数据到系统内存缓存。控制器立即返回给调用者,若传输依据入队,则返回OK,或DMA设备队列满,则返回ERROR。pDmaComplete和pArg可用以指明一个回调函数,当传输完成时。

STATUS (*dmaRead) (

VXB_DMA_RESOURCE_ID dmaChan, char * src, char * dest,

int transferSize, int unitSize, UINT32 flags,

pVXB_DMA_COMPLETE_FN pDmaComplete, void * pArg );

3.8.2 (*dmaReadAndWait)( )

(*dmaReadAndWait)( )和(*dmaRead)( )相似,除了控制器指定传输完成才返回。

STATUS (*dmaReadAndWait) (

VXB_DMA_RESOURCE_ID dmaChan, char * src, char * dest,

int * pTransferSize, int unitSize, UINT32 flags );

3.8.3 (*dmaWrite)( )

(*dmaWrite)( )从设备上缓存或寄存器排序一个写操作到系统内存缓存。控制器立即返回给调用者,若正常入队,则返回OK;若DMA设备队列慢,则返回ERROR。。pDmaComplete和pArg可用以指明一个回调函数,当传输完成时。

STATUS (*dmaWrite) (

VXB_DMA_RESOURCE_ID dmaChan, char * src, char * dest, int transferSize, int unitSize, UINT32 flags,

pVXB_DMA_COMPLETE_FN pDmaComplete, void * pArg );

3.8.4 (*dmaWriteAndWait)( )

(*dmaWriteAndWait)( )和(*dmaWrite)( )类似,除了除了控制器指定传输完成才返回。

STATUS (*dmaWriteAndWait) (

VXB_DMA_RESOURCE_ID dmaChan, char * src, char * dest,

int * pTransferSize, int unitSize,

UINT32 flags );

3.8.5 (*dmaCancel)( )

(*dmaCancel)( )取消当前正在工作通道的一个读或写操作。防止通道上产生任何其它I/O操作,直到一个新的读或写操作入队。

STATUS (*dmaCancel) (

VXB_DMA_RESOURCE_ID dmaChan );

3.8.6 (*dmaPause)( )

(*dmaPause)( )暂停正在传输的DMA通道。暂停一个通道允许调用者安全操作任何当下DMA描述符或和通道关联的缓存结构,无须完全取消DMA操作。一个暂停的通道可以通过(*dmaResume)( )恢复。

STATUS (*dmaPause) (

VXB_DMA_RESOURCE_ID dmaChan );

3.8.7 (*dmaResume)( )

恢复一个已经暂停的DMA通道,或处于idle状态的DMA通道。

STATUS (*dmaResume) (

VXB_DMA_RESOURCE_ID dmaChan );

3.8.8 (*dmaStatus)( )

返回具体DMA通道状态。有效返回值是DMA_NOT_USED, DMA_IDLE, DMA_RUNNING, or DMA_PAUSED。

int (*dmaStatus) (

VXB_DMA_RESOURCE_ID dmaChan );

3.9 调试

因为DMA驱动可以在整个VxWorks系统完全初始化时测试,DMA驱动的调试通常比较简单。当调试DMA驱动时,VxWorks的完全调试功能,和传统的调试手段一样,如logMsg( ),比较有效。DMA驱动的唯一负责因素是不能再一个真空环境下测试。因为DMA驱动是提供给系统其他设备的一个服务,必须用另外一个驱动测试。针对调试目的,可以编写一个测试驱动,调用vxbDmaLib库,分配一个DMA通道,并初始化模拟传输。

通用调试信息,参考VxWorks Device Driver Developer’s Guide (Vol. 1): Development Strategies。

4 中断控制器驱动


vxWorks设备驱动开发指南(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:酒店管理论文范文2

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: