鼻子冒热气是什么原因| mfd是什么意思| 痛风会在膝盖什么位置| 阴茎瘙痒是什么原因| 农村养殖什么好| 十月二十二是什么星座| 支气管激发试验阴性是什么意思| 胸腔积液是什么原因造成的| 射精什么感觉| 长脸型适合什么样的发型女| 小孩肚脐眼上面疼是什么原因| 肺ca是什么病| 儿童疝气挂什么科| 吃芒果有什么坏处| 朱砂痣是什么| 感冒发烧可以吃什么水果| 什能组什么词| 淋巴细胞比率低是什么意思| 桥本是什么意思| lava是什么意思| 乳腺炎不能吃什么| 6月17日什么星座| 258是什么意思| 血月代表什么| 怀疑甲亢需要做什么检查| 什么水果养胃又治胃病| me too是什么意思| 什么东西可以止痒| 空腹吃荔枝有什么危害| 探望产妇带什么礼物好| 豹纹守宫吃什么| 肌酐下降是什么原因| 乳腺囊性结节是什么意思| 巧克力囊肿是什么| 容易犯困是什么原因| 嘴角起泡是什么原因| 拍黄瓜是什么意思| 女孩子学什么专业| 舌头起泡什么原因| amh是什么意思| 肝气不足吃什么中成药| 换药挂什么科| 吃什么通便| 什么的李子| 烤乳扇是什么| 笑口常开是什么生肖| 杭州灵隐寺求什么最灵| 耳朵疼是什么原因| 大便稀溏是什么意思| 解酒喝什么饮料| 雷暴是什么意思| 扁平比是什么意思| 小便次数多吃什么药| 什么是翘舌音| 宗人府是什么地方| 什么人容易得格林巴利| 肾虚和肾亏有什么区别| 脑血管痉挛是什么症状| 沙蟹吃什么| 增致牛仔属于什么档次| 血糖高吃什么食物最好最佳| 小腿肌肉酸痛什么原因| 贤良淑德后半句是什么| 糖尿病什么水果不能吃| 肠系膜脂膜炎是什么病| 为什么8到10周容易胎停| 猪的五行属什么| 明知故犯的故是什么意思| 顺风顺水什么意思| 特别嗜睡是什么原因| 犹怜是什么意思| 中国国酒是什么酒| 气短吃什么药效果好| 肛门周围痒是什么原因| 皇帝菜是什么菜| 什么叫蜘蛛痣| 相对湿度是什么意思| 空调为什么要加氟| 白蜡金命五行缺什么| 为什么癌症治不好| 脉弱是什么意思| 宝付支付是什么| 怀孕两个星期有什么反应| ec是什么意思| 碱性磷酸酶偏低是什么意思| 半盏流年是什么意思| 85年什么命| 吃无花果干有什么好处| pubg什么意思| 胃癌吃什么药| 世界上最长的蛇是什么| 为什么肚子越来越大| 脖子上长个包挂什么科| 975是什么意思| 怀孕吃什么可以快速流产| 什么菜降血压效果最好| 决明子是什么东西| 蛋白质被消化成什么| 宝宝吃什么奶粉好| 婴儿蚊虫叮咬红肿用什么药| 满月是什么意思| 被蝎子蛰了有什么好处| 124什么意思| 间隔旁型肺气肿是什么| 什么肉是发物| 做梦梦到踩到屎是什么意思| 两个大于号是什么车| 益安宁丸主治什么病| 为什么小腹总是胀痛| 什么眉头| 心阴虚吃什么中成药| 血脂高吃什么水果| 什么东西补钙最好最快| 兰花长什么样| 舅舅的女儿叫什么| 蜂蜜为什么不会变质| 异地办理临时身份证需要什么材料| 什么东西越晒越湿| 什么叫慢阻肺| 人质是什么意思| 绘本是什么| 翘楚是什么意思| ao是什么意思| 当归有什么作用| 梦见办丧事是什么兆头| omega是什么意思| 救世主是什么意思| 不小心怀孕了吃什么药可以流掉| 十三香是什么| 欲盖弥彰是什么意思| 骨扫描是检查什么| 热量是什么| 369是什么意思啊| 独什么心什么| 97属什么生肖| 心花怒放是什么意思| 眼睛出现重影是什么原因| 什么茶解暑| 身上长痘痘是什么原因| 公分是什么意思| 苏州立夏吃什么| 什么样属于轻度地包天| 糖耐量受损是什么意思| au750是什么材质| 儿茶酚胺是什么| 室早三联律是什么意思| 猪肝不能和什么一起吃| 经常叹气是什么原因| 镶牙与种牙有什么区别| 菠萝蜜的核有什么功效| 为什么会失眠| 制冰机不制冰是什么原因| 摩羯座女和什么座最配| 瞽叟是什么意思| 减肥应该吃什么| 总胆固醇高是什么原因| 什么的风雨| 脾胃虚是什么症状| 电子烟有什么危害| crp高是什么意思| 藏蓝色是什么颜色| 一什么狮子| 什么是碱性水| 侃大山什么意思| 每天吃松子有什么好处| 肺与什么相表里| 药流后吃什么消炎药比较好| 魔芋是什么做的| 血崩是什么症状| 粗脖子病是什么原因引起的| 生男孩女孩取决于什么| 蛋白粉什么时候吃最好| 心悸吃什么药好| 吃羊肉不能和什么一起吃| 什么是冤亲债主| 又什么又什么造句| 皮下紫癜是什么引起的| ab型和a型生的孩子是什么血型| 蛇为什么会咬人| 湿疹用什么药好得最快最有效| 156是什么意思| 左眼皮跳什么意思| peek是什么材质| 梦见吃老鼠肉是什么意思啊| 出阁是什么意思| 静脉曲张是什么| 投射效应是什么意思| bp是什么的缩写| medium什么意思| philips是什么品牌| ssg是什么意思| 什么是横纹肌肉瘤| 侯是什么意思| 日值四离是什么意思| 低血压吃什么好的最快女性| 户口是什么意思| 钴对人体有什么伤害| 经常口腔溃疡是什么原因引起的| 头发长的快是什么原因| 吃什么减肥瘦肚子| 元旦是什么节日| 1968年属什么生肖| 地米是什么药| 什么是阿尔茨海默症| 牛属相和什么属相配| 手指关节痛吃什么药好| 扁桃体发炎吃什么食物| 妈妈咪呀是什么意思| 舒畅的舅舅是做什么的| 癃闭是什么意思| 携字去掉提手旁读什么| 肾结石少吃什么食物| 精索静脉曲张什么症状| 过敏性皮炎用什么药| 4.23是什么星座| 交工是什么意思| 左心房扩大是什么意思| 蛋白质用什么试剂鉴定| 统招生是什么意思| 手指缝里长水泡还痒是什么原因| 经期吃什么水果比较好| 扁桃是什么水果| 双规什么意思| 打破伤风挂什么科| 宫颈肥大是什么意思| 风起云涌是什么意思| lp是什么的简称| 吃什么可以生发| 淋巴结节挂什么科| 明年是什么年啊| 尿潴留是什么原因引起的| 什么油炒菜好吃| 二脚趾比大脚趾长代表什么| 1月16日什么星座| 12月13号什么星座| 身上起痘痘是什么原因| 小鱼缸适合养什么鱼| 艺高人胆大什么意思| 金蟾折桂什么意思| 脚趾长痣代表什么意思| 海鲜菇不能和什么一起吃| 两袖清风是什么生肖| 女人在什么时候最容易怀孕| 低密度脂蛋白高有什么症状| 眼睛发黄什么原因| 十字架代表什么| 鸦片鱼又叫什么鱼| 牵牛花像什么| 什么叫三焦| 毛囊长什么样子| 茉莉茶属于什么茶| 黄痰吃什么药最好| 吃葱有什么好处和坏处| 男性前列腺炎吃什么药| 肉字是什么结构| 子宫内膜厚是什么原因| 舌苔厚白应该吃什么| 结婚5年是什么婚| 12月13号什么星座| 心脏属于什么系统| 东海龙王叫什么名字| 阿司匹林肠溶片什么时候吃最好| 台风是什么| 什么是禅| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 嵌入式开发 ? MCU ? [转帖]串口驱动编写实例解读(一)

共4条 1/1 1 跳转至

[转帖]串口驱动编写实例解读(一)

菜鸟
2025-08-05 21:04:05     打赏
串口驱动(Serial Drivers)编写实例解读(连载:一) <--- 〖回复该帖子〗 串口驱动(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 ※



关键词: 转帖     串口     驱动     编写     实例     解读    

菜鸟
2025-08-05 21:09:00     打赏
2楼
已拜读,请教! <--- 〖回复该帖子〗 我发现在usrSerial.c中定义了TY_NAME_BASE "/tyCo/" 如果我使用scc3做uart串口,设备名是否只能为"/tyCo/x"形式? 还是任意取名tty 设备名,然后该设备名通过一个SIO_CHAN,在xxCallbackInstall函数中传给上层协议, 上层在通过SIO_CHAN调用IOCTL来控制串口驱动. 请你指教,谢谢! ※ 作 者: little 01-5-23 下午 02:31:59 ※ reply little <--- 〖回复该帖子〗 Little: 设备名只要是唯一的就可以了... 另,你用scc3做uart一定使用st16c552或者st16c554吧? 我现有st16c552(可扩展两个串口)的完全驱动程序.正开发st16c554(带4个 ACE,可扩展4个串口)的驱动, 欢迎多多交流... ※ 作 者: 自由妹妹 01-5-23 下午 02:59:45 ※

菜鸟
2025-08-05 21:11:00     打赏
3楼
Re:串口驱动(Serial Drivers)编写实例解读(连载:一) <--- 〖回复该帖子〗 自由妹妹: 拜读了您的程序,受益良多,我想问如果是用1655X系列作的扩展串口卡,可不可以将Vxworks的标准串中驱动直接扩展到自己卡上用呢? ※ 作 者: 化民 01-5-28 上午 07:39:13 ※ Re:Re:串口驱动(Serial Drivers)编写实例解读(连载:一) <--- 〖回复该帖子〗 化民: VXworks标准的串口驱动是采用SMC(串口通讯控制器)的两个通道,1655x的机制与之不同,故虽然其驱动程序架构相同,但实现起来差异较大. 我现在在把SMC和16c554整合到一起,而且现在已经有阶段性成果,希望我们可以多交流... 另外,我很快会推出一篇关于这个的文章(顺便回击一下论坛上某些人对我的指责),请期待... 自由妹妹 ※ 作 者: 自由妹妹 01-5-28 下午 10:23:03 ※

菜鸟
2025-08-05 21:12:00     打赏
4楼
串口驱动(Serial Drivers)编写实例解读(连载:一) <--- 〖回复该帖子〗 大家好,看了大家的高作,有找到亲人的感觉,我现在正在vxworks下进行协议开发,但是对vxworks的机制很是不熟,在对串口驱动的开发中,我扩展了12个串口(用3片16c554),利用epld进行地址译码(地址0x1000开始),中断的合并(把16c554的12个中断合成一个x86的中断),完全按照汇编的方式对串口进行编程。我想做成标准的驱动程序的方式,请大家多多指导。 我的程序如下,有些语句是调试用的,没有一一去掉,请多包涵: /*初始化函数,iosign为第几个串口,0--11)*/ void comini(int iosign) { /*清空原来状态*/ sysInByte(0x1000*iosign+0x1100+lsr);/*read LSR*/ sysInByte(0x1000*iosign+0x1100+msr);/*READ MSR*/ sysInByte(0x1000*iosign+0x1100+iir);/*READ IIR*/ sysInByte(0x1000*iosign+0x1100+rbr);/*READ RBR*/ sysOutByte(0x1000*iosign+0x1100+lcr,0); /* DLAB=0 */ sysOutByte(0x1000*iosign+0x1100+ier,0); /* CLOSE INT */ sysInByte(0x1000*iosign+0x1100+lsr);/*read LSR*/ sysInByte(0x1000*iosign+0x1100+msr);/*READ MSR*/ sysInByte(0x1000*iosign+0x1100+iir);/*READ IIR*/ sysInByte(0x1000*iosign+0x1100+rbr);/*READ RBR*/ sysOutByte(0x1000*iosign+0x1100+lcr,0x80);/*set DLAB=1*/ sysOutByte(0x1000*iosign+0x1100+dlm,0);/*DLM=0*/ sysOutByte(0x1000*iosign+0x1100+dll,0x30);/*DLL=0x0c,set 9600*/ sysOutByte(0x1000*iosign+0x1100+lcr,0x03);/*set n,8,1*/ sysOutByte(0x1000*iosign+0x1100+mcr,0x0b);/*mcr=0x0b,P527*/ sysInByte(0x1000*iosign+0x1100+lsr);/*read LSR*/ sysInByte(0x1000*iosign+0x1100+msr);/*READ MSR*/ sysInByte(0x1000*iosign+0x1100+iir);/*READ IIR*/ sysInByte(0x1000*iosign+0x1100+rbr);/*READ RBR*/ #ifndef ENABLE_FOLLOW sysOutByte(0x1000*iosign+0x1100+ier,0x03); #else sysOutByte(0x1000*iosign+0x1100+ier,0x0b); #endif } 再在初始化中循环调用12次,12个串口的初始化就能完成。 用 vectot7 = INUM_TO_IVEC((INT_NUM_IRQ0)+7); intConnect(vectot7,FunIRQ7,0); 把中断7定向到函数FunIRQ7(),这个函数处理8个串口,另外4个类似 void FunIRQ7() /*com0--7*/ { unsigned char temp; #ifdef ENABLE_FOLLOW unsigned char mymsr; #endif int mycnt; int ionumber; int i; unsigned char _flag[8]; for(i=0;i<=7;i++) _flag[i]=sysInByte(0x1000*i+0x1100+iir); do { for(ionumber=0;ionumber<=7;ionumber++) { if((_flag[ionumber]&0x01)==0) { do { switch(_flag[ionumber]&0x0f) { #ifdef ENABLE_FOLLOW case 0: /*处理流控*/ break; #endif case 4: case 12: /*接收数据*/ break; case 2: /*发送数据*/ break; default: break; } }while(((_flag[ionumber]=sysInByte(0x1000*ionumber+0x1100+iir))&0x01)==0); } } for(i=0;i<=7;i++) _flag[i]=sysInByte(0x1000*i+0x1100+iir); }while(((_flag[0]&0x01)==0)||((_flag[1]&0x01)==0)||((_flag[2]&0x01)==0)\||((_flag[3]&0x01)==0)||((_flag[4]&0x01)==0)||((_flag[5]&0x01)==0)\||((_flag[6]&0x01)==0)||((_flag[7]&0x01)==0)); } 希望大家多联系,freedom_zj@163.com ※ 作 者: freedomzj 01-6-27 上午 11:18:38 ※

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
皮肤挂什么科 骨质疏松吃什么药好 牛肉馅饺子配什么菜 什么颜色招财并聚财 枸杞泡水喝有什么功效
开救护车需要什么驾照 经常吐口水是什么原因 乳腺囊实性结节是什么意思 市场部是做什么的 打太极拳有什么好处
经常闪腰是什么原因引起的 为什么老是睡不着 肠易激综合征是什么原因造成的 榻榻米床垫什么材质的好 预检是什么意思
冠心病吃什么药好 嗜血是什么意思 金不换是什么 七匹狼属于什么档次 克隆是什么意思
丁香泡水喝有什么功效和作用hcv8jop7ns1r.cn 慢性心肌炎有什么症状hcv9jop7ns5r.cn 逍遥丸什么人不能吃hcv8jop2ns9r.cn id是什么意思的缩写hcv8jop3ns1r.cn 什么是植物hcv8jop6ns9r.cn
主诉是什么意思hcv7jop7ns1r.cn 广东话扑街是什么意思xianpinbao.com 减肥不能吃什么水果hcv9jop0ns7r.cn 生长痛是什么hcv9jop2ns8r.cn 什么食物含碘高hcv8jop4ns1r.cn
吃生蚝有什么好处和坏处hcv8jop1ns6r.cn 腻歪是什么意思hcv8jop2ns0r.cn 女人怀孕的最佳时间是什么时间hcv7jop6ns5r.cn adr是什么意思hcv9jop5ns5r.cn 健脾胃吃什么食物好hcv8jop0ns9r.cn
什么老什么老hcv9jop2ns3r.cn 蛔虫属于什么动物hcv8jop8ns2r.cn 范思哲手表什么档次wzqsfys.com 肺结节有什么症状hcv9jop4ns3r.cn 衙内是什么意思hcv9jop6ns7r.cn
百度