共1条
1/1 1 跳转至页
[转帖]Vxworks串口驱动编写实例解读
发信人: lhwhit (bug), 信区: Embedded_system
标 题: Re: 串口驱动(Serial Drivers)编写实例解读(连载:一)
发信站: 哈工大紫丁香 (Mon May 20 08:15:48 2002) , 转信
【 在 liangzq (萍水) 的大作中提到: 】
: 串口驱动(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);
: }
: ※ 作 者: 自由妹妹 01-5-22 下午 05:10:58 ※
关键词: 转帖 Vxworks 串口 驱动 编写 实例 解读
共1条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |