这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » [转帖]Vxworks串口驱动编写实例解读

共1条 1/1 1 跳转至

[转帖]Vxworks串口驱动编写实例解读

菜鸟
2002-05-26 04:52:00     打赏
发信人: 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 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]