Embedded Digital System                             

 

串口驱动(Serial Drivers)编写实例解读


[代码步骤:Code Steps] 
。初始化 
。定义支持的串口通道数 
。初始化驱动的设备描述 
。写你的设备初始化代码 
。写入口程序(entry point routines) 
。写ISRs(中断服务程序)来管理设备 
。使用模板 wind/target/src/drv/ssio/templateSio.c 

注意:串口驱动在VxWorks系统开始的代码里初始化 

[
设备描述:The Device Descriptor] 
XX_DRV结构每个通道有一个XX_CHAN 
。每个XX_CHAN指向SIO_DRV_FUNCS 
SIO_DRV_FUNCS引诱驱动的入口(entry point 

XX_DRVxxDrv使用的中心数据结构 
xx_CHAN包括
xxDrv需要的通道特定信息 
。指向驱动SIO_DRV_FUNCS结构的指针 
。例: 
/* device and channel structures */ 

typedef struct 

/* must be first */ 

SIO_CHAN sio; /* standard SIO_CHAN element */ 

/* callbacks */ 

STATUS (*getTxChar) (); 
STATUS (*putRcvChar) (); 
void * getTxArg; 
void * putRcvArg; 

/* register addresses */ 

volatile char * cr; /* channel control register */ 
volatile char * dr; /* channel data register */ 
volatile char * sr; /* channel status register */ 
volatile char * ms; /* channel modem status register */ 
volatile char * mc; /* channel modem control register */ 
volatile short * br; /* channel baud constant register */ 

/* misc */ 

int mode; /* current mode (interrupt or poll) */ 
int baudFreq; /* input clock frequency */ 
int options; /* Hardware options */ 
} TEMPLATE_CHAN; 

typedef struct 

TEMPLATE_CHAN portA; /* DUSRAT has two channels */ 
TEMPLATE_CHAN portB; 
volatile char * masterCr; /* master control register */ 
} TEMPLATE_DUSART; 

[SIO_CHAN
结构
。对一般字符驱动,一个指向DEV_FDR的指针被用来在驱动和I/O system 之间通讯 
。对一个串口驱动,一个指向SIO_CHAN的指针用来在驱动和高层协议之间通讯 

wind/target/h/sioLib.h;里,SIO_CHAN如下定义
typedef struct sio_chan/* a serial channel */ 

SIO_DRV_FUNCS * pDrvFuncs; 
/* device data */ 
} SIO_CHAN; 

.
由于高层协议不知道驱动的XX_CHAN结构,SIO_CHAN被用来允许一个精心定义的数据类型在协议间交换数据 
.ttyDrv
通过SIO_DRV_FUNCS里的入口向xxDrv发送信息,而xxDrv通过回调向ttyDrv发送信息 
[
入口:Entry Points] 
xxCallBackInstall()
安装到高层协议的入口(I/O system,target agent(目标代理),等等
xxPollOutPut()
轮巡模式输出 
xxPollInput()
轮巡模式输入 
xxIoctl()
支持设备特定的ioctl命令 
xxTxStaartup()
初始化一个传输循环(transmit cycle) 

[
驱动回调安装程序
int xxCallbackInstall(pSsioChan,callbackType,callback,callbbackArg) 
pSioChan
指向SIO_CHAN的指针 
callbackType SIO_CALLBACK_GET_TX_CHAR
SIO_CALLBACK_PUT_RCV_CHAR 
callback
指向回调程序的指针 
callbackArg
回调的参数 
。初始化SIO_CHAN结构里的特定成员 
。返回OK ENOSYS(callbackType不是上两种中的一种
/******************************************************************************** 
templateCallbackInstall - install ISR callbacks to get/put chars 
This driver allows interrupt callbacks for transmitting characters 
and receiving characters. In general, drivers may support other 
types of callbacks too. 

* RETURNS: OK on success, or ENOSYS for an unsupported callback type.*/ 
LOCAL int templateCallbackInstall 

SIO_CHAN * pSioChan, /* channel */ 
int callbackType, /* type of callback */ 
STATUS (*callback)(), /* callback */ 
void * callbackArg /* parameter to callback */ 


TEMPLATE_CHAN * pChan = (TEMPLATE_CHAN *)pSioChan; 

switch (callbackType) 

case SIO_CALLBACK_GET_TX_CHAR: 
pChan->getTxChar = callback; 
pChan->getTxArg = callbackArg; 
return (OK); 

case SIO_CALLBACK_PUT_RCV_CHAR: 
pChan->putRcvChar = callback; 
pChan->putRcvArg = callbackArg; 
return (OK); 

default: 
return (ENOSYS); 



[
驱动初始化
。参数是没一个指向XX_DRV的指针 
。初始化XX_CHAN 
。带你的程序的SIO_DRV_FUNCS 
。傀儡回调 
。所有设备特定 
。重启芯片 
/* local variables */ 

LOCAL SIO_DRV_FUNCS templateSioDrvFuncs = 

templateIoctl, 
templateTxStartup, 
templateCallbackInstall, 
templatePollInput, 
templatePollOutput 
}; 
void templateDevInit 

TEMPLATE_DUSART * pDusart 


/* initialize each channel"s driver function pointers */ 

pDusart->portA.sio.pDrvFuncs = &templateSioDrvFuncs; 
pDusart->portB.sio.pDrvFuncs = &templateSioDrvFuncs; 

/* install dummy driver callbacks */ 

pDusart->portA.getTxChar = dummyCallback; 
pDusart->portA.putRcvChar = dummyCallback; 
pDusart->portB.getTxChar = dummyCallback; 
pDusart->portB.putRcvChar = dummyCallback; 

/* reset the chip */ 

TEMPLATE_REG_WRITE(pDusart, masterCr, 
TEMPLATE_RESET_CHIP); 

/* setting polled mode is one way to make the device quiet */ 

templateIoctl ((SIO_CHAN *)&pDusart->portA, SIO_MODE_SET, 
(void *)SIO_MODE_POLL); 
templateIoctl ((SIO_CHAN *)&pDusart->portB, SIO_MODE_SET, 
(void *)SIO_MODE_POLL); 

/******************************************************************************* 

* dummyCallback - dummy callback routine 

* RETURNS: ERROR. 
*/ 

LOCAL STATUS dummyCallback (void) 

return (ERROR); 

 

TOP  HOME

Embedded  Digital System Co.,Ltd. CANADA 嵌入数码系统公司 Email: embedigital@yahoo.com

copy right © 2002 All Rights Reserved