串口驱动编写 点击:730 | 回复:0



gongkongedit

    
  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2004-02-25 18:21:00
楼主
串口驱动(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 。傀儡回调 。所有设备特定 。重启


热门招聘
相关主题

官方公众号

智造工程师