在860里增加TL16C554多串口芯片驱动

上传人:学**** 文档编号:196323664 上传时间:2021-09-18 格式:DOCX 页数:14 大小:54.32KB
返回 下载 相关 举报
在860里增加TL16C554多串口芯片驱动_第1页
第1页 / 共14页
在860里增加TL16C554多串口芯片驱动_第2页
第2页 / 共14页
在860里增加TL16C554多串口芯片驱动_第3页
第3页 / 共14页
在860里增加TL16C554多串口芯片驱动_第4页
第4页 / 共14页
在860里增加TL16C554多串口芯片驱动_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《在860里增加TL16C554多串口芯片驱动》由会员分享,可在线阅读,更多相关《在860里增加TL16C554多串口芯片驱动(14页珍藏版)》请在金锄头文库上搜索。

1、在 860 里增加TL16C554多串口芯片驱动(一)一设备概述MPC860t 有 4 个 SCC(serial communicationscontroller management controller 串口治理掌握器), 一共可以扩展串口通讯掌握器) 和 2 个 SMC(serial6 个串口;但笔者开发的通讯掌握器SMC扩展明显不能满意要求,需要需8 个或更多串口,SCC和;项目中,由于考虑到需要扩展求一种新的可扩展的串口芯片我们采纳两个TL16C554 芯片来解决这个问题;一 个TL16C554 芯 片 集 成 了 四 个ST16550ACE( 异 步 通 讯 元 件ASYNCHRO

2、NOUSCOMMUNICATIONS ELEMENT);二串口驱动简介I/O SystemxxDrv , yyDrv 表示一个特定的驱动程序, 下同虚拟驱动,用以.治理 It/OtySDysrtevm.调用实际的驱动程序来治理硬件留意:此处. ttyDrv. ModelxxDrvApplicationyyDTravrgetAgent( 中断或轮巡模式 )xxChan1I/O SystemxxChan2yyChan1yyChan2ttyDrv( 中断模式 )xxDrv. xxDrv支持 :标准 I/O System接口Target Agent接口两种模式 ( 中断 interrupt, 轮巡.回

3、调 CallBackspoll)答应高层协议来设定驱动怎样收发数据有两个回调 (驱动调用 )getCallback驱动设备高层协议putCallBackputget回调 :传送一个从设备读到的字符到高层协议回调 :从高层协议取得一个字符以便写到设备代码实现usrConfig.csysSerial.c一般性代码特定执行代码xxDrv.c设备特定代码三具体解说(调用和实现部分)usrConfig.c,sysSerial.c留意:由于我们采纳了多种设备实际的驱动合,整合的函数包括sysSerialHwInit(),(SMC和 16C554), 所以在 sysSerial.c里需要整sysSerial

4、HwInit2 (),sysSerialChanGet(),sysSerialReset()解读 usrConfig.c先看usrConfig.c里与串口有关的部分( 前面部分是早期版本的,不予理睬) ,这里调用了里定义,它把ttyDrv(),ttyDevCreate(),sysSerialChanGet()在 sysSerials.c然后用SIO_CHAN类型的结构关联起来,而这个结构在是至关重要的.(设备的编号同一个留意,如)果系统采纳串口调试,就该串口号被保留起来ttyDev()作的工作:调用 iosDrvInstall安装 ttyDrvttyDrv和 tyLib到设备表(使用的入口)t

5、tyDevCreate()作的工作:申请并初始化设备描述调用 tyDevinit()初始化 tyLib初始化 selectLib建立输入输出环行缓冲创建信号量调用 iosDevAdd()增加设备到设备列表安装 tyLib的程序和输入输出回调使设备开头中断模式#ifdef#ifdefINCLUDE_TYCODRV_5_2INCLUDE_TTY_DEVif (NUM_TTY 0)tyCoDrv ();/* install console driver */for (ix = 0; ix 0)ttyDrv();/* install console driver */for (ix = 0; ix =

6、 chanNum)return (SIO_CHAN *) ERROR);return (SIO_CHAN *) &ppc860Chan channel);单独采纳16c554 时为 :SIO_CHAN * sysSerialChanGet (int channel)if (channel = (int) (NELEMENTS(sysSioChans) ) return (SIO_CHAN *) ERROR;return sysSioChanschannel;我们必需把两种情形整合.SIO_CHAN * sysSerialChanGet (int channel)if (channel = (i

7、nt) (NELEMENTS(sysSioChans) ) return (SIO_CHAN *) ERROR;if channel=1return (SIO_CHAN *)ppc860Chanchannel elsereturn sysSioChanschannel-2;sysSerialReset()关于 sysSerialResset,由于 16c554 和所以在 sysSerialReset()里要考虑两中情形 void sysSerialReset (void)/* disable serial interrupts */ intDisable (devParas0.intLevel

8、);void sysSerialReset (void)sysSerialHwInit ();void sysSerialReset (void)sysSerialHwInit ();intDisable (devParas0.intLevel);重中之重:关于sysSerialHwInit2 ()860 的 smc 采纳不同的原理,所以其重启也有不同,sysSerialHwInit2() 由 usrConfig.c 里 的 usrRootsmc 的如下 :void sysSerialHwInit2 (void)调用,用于连接中断inti;/* an index */* connect ser

9、ial interrupts */ for (i = 0; i i);CIMR 是一个叫 CP Int mask reg 的宏,这里分别开启SMC1 和 SMC2 的中断#define CIMR_SMC1#define CIMR_SMC2_PIP0x00000010/* SMC 1 */0x00000008/* SMC 2 */#defineCIMR(base)(CAST(VUINT32 *)(base) + 0x0948)为什么在不在sysSerialHwinit() 里调用连接呢?由于在sysHwInit() 执行的时刻内核内存安排算符仍没有初始化.16c554 的:void sysSerialHwInit2 (void)(void) intConnect (INUM_TO_IVEC(devParas0.vector), st16554MuxInt, (int) &st16554Mux);intEnable (devParas0.intLevel);各位必需留意, 16c554 中断服务程序是一个多重的,意思是 :全部使用同一中断的8 个通st16554MuxInt ()处理的时候需要做出相应的判定(具道有一样的中断服务程序,这样在体实现见后面)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 初中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号