串口驱动(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_DRV是xxDrv使用的中心数据结构
。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);
}
引用地址:串口驱动(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_DRV是xxDrv使用的中心数据结构
。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);
}
上一篇:实时操作系统VxWorks
下一篇:VxWorks使用说明书(1)
小广播
热门活动
换一批
更多
最新嵌入式文章
更多精选电路图
更多热门文章
更多每日新闻
更多往期活动
- 给你一个SEED-DIM3517 ,你可以DIY啥?
- 免费申请富士通FRAM 晒心得 赢大礼!
- 填问卷,解锁赢好礼!看泰克MDO4000C如何进行电源分析!
- 趣味电子技术史话第二讲:开关电源的早期历史
- 发帖赢好礼 | MPS 工程师为您解决DC-DC设计难题
- TE助力数据中心设计,缩短你与奥运的距离,猜猜它属于哪个“奥运场馆”赢大礼!
- EEworld新春感恩回馈之ST新出道“高富帅”STM32F746G-DISCO 199元包邮
- ADI软件定义无线电(SDR)专题文章
- 【EE团】尽享TI MSP-EXP430FR5739实验板套件!
- 艾睿电子线上研讨会:英特尔FPGA深度学习加速技术 7月30日上午10:00-11:30 期待您的莅临!
厂商技术中心