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

出处:互联网    发布于:2011-09-05 08:16:40

 
  在当前数字信息技术和网络技术高速发展的后PC(Post-PC)时代,嵌入式系统已经广泛地渗透到科学研究、工程设计、军事技术、各类产业和商业文化艺术以及人们的日常生活等方方面面中。所谓嵌入式系统,是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。Windows CE.net是微软公司推出的32位嵌入式操作系统,具备多任务、实时性、模块化及可伸缩性、强大的通信能力以及图形界面友好等优点。将操作系统和相应硬件设备连接起来,需要通过编写设备驱动程序。下面介绍一个串口驱动编写实例。
 
  [代码步骤: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);
  }

 


  
关键词:串口驱动

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:
技术客服:

0571-85317607

网站客服电话

0571-85317606

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!