- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
精 品[精品]00在860里增加TL16C554多串口芯片驱...
2011精品
ksdowe
在860里增加TL16C554多串口芯片驱动(一)
一.设备概述
MPC860t有4个SCC(serial communications controller串口通讯控制器)和2个SMC(serial management controller串口管理控制器),一共可以扩展6个串口。但笔者开发的通讯控制器项目中,由于考虑到需要扩展8个或更多串口,SCC和SMC扩展显然不能满足要求,需要需求一种新的可扩展的串口芯片 。
我们采用两个TL16C554芯片来解决这个问题。
一个TL16C554芯片集成了四个ST16550 ACE(异步通讯元件ASYNCHRONOUS COMMUNICATIONS ELEMENT)。
二.串口驱动简介
I/O System
yyChan2
yyChan1
xxChan2
xxChan1
yyDrv
xxDrv
ttyDrv
注意:此处xxDrv,yyDrv表示一个特定的驱动程序,下同
. ttyDrv 虚拟驱动,用以
.管理I/O System
.调用实际的驱动程序来管理硬件
. Model
Target Agent(中断或轮巡模式)
Application
I/O System
ttyDrv(中断模式)
xxDrv
. xxDrv支持:
标准I/O System接口
Target Agent接口
两种模式(中断interrupt,轮巡poll)
.回调CallBacks
允许高层协议来设定驱动怎样收发数据
设备
驱动
有两个回调(驱动调用)
高层协议
getCallback
putCallBack
put回调:传送一个从设备读到的字符到高层协议
get回调:从高层协议取得一个字符以便写到设备
代码实现
usrConfig.c 一般性代码
sysSerial.c 特定执行代码
xxDrv.c 设备特定代码
三.详细解说(调用和实现部分)
usrConfig.c,sysSerial.c
注意:由于我们采用了多种设备实际的驱动(SMC和16C554),所以在sysSerial.c里需要整合,整合的函数包括sysSerialHwInit(),
sysSerialHwInit2 (),sysSerialChanGet(),sysSerialReset()
解读usrConfig.c
先看usrConfig.c里与串口有关的部分(前面部分是早期版本的,不予理会),这里调用了ttyDrv(),然后用ttyDevCreate(),sysSerialChanGet()在sysSerials.c里定义,它把设备的编号同一个SIO_CHAN类型的结构关联起来,而这个结构在是至关重要的.(注意,如果系统采用串口调试,则该串口号被保留起来)
ttyDev()作的工作:
调用iosDrvInstall安装ttyDrv到设备表(使用ttyDrv和tyLib的入口)
ttyDevCreate()作的工作:
申请并初始化设备描述
调用tyDevinit()初始化tyLib
初始化selectLib
建立输入输出环行缓冲
创建信号量
调用iosDevAdd()增加设备到设备列表
安装tyLib的程序和输入输出回调
使设备开始中断模式
#ifdef INCLUDE_TYCODRV_5_2
#ifdef INCLUDE_TTY_DEV
if (NUM_TTY 0)
{
tyCoDrv (); /* install console driver */
for (ix = 0; ix NUM_TTY; ix++) /* create serial devices */
{
sprintf (tyName, %s%d, /tyCo/, ix);
(void) tyCoDevCreate (tyName, ix, 512, 512);
if (ix == CONSOLE_TTY)
strcpy (consoleName, tyName); /* store console name */
}
consoleFd = open (consoleName, O_RDWR, 0);
/* set baud rate */
(void) ioctl (consoleFd, FIOBA
原创力文档


文档评论(0)