OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » vxworks中编写串口驱动?(老站转)

共1条 1/1 1 跳转至

vxworks中编写串口驱动?(老站转)

菜鸟
2002-06-01 00:30:00    评分
springwind 工程师 来自: 发表总数:51   查看   短消息   电子邮件 -------------------------------------------------------------------------------- 我现在要在编写MPC860的scc2的串口驱动程序,又的操作系统是vxworks,但是我不太清楚其中都包括哪些内容,怎么才能将自己编写的东西连到vxworks上去。 请哪位大侠指点一下,请告诉我驱动开发的顺序及其内容。多谢!!! -------------------------------------------------------------------------------- 编辑 发表於:2001-12-31 - 16:51:57 IP: 210.74.*.* amine 版主 来自: 发表总数:519 查看   短消息   电子邮件 -------------------------------------------------------------------------------- 看看前面的帖子: Vxworks下驱动程序编写(转) Hope this help!! -------------------------------------------------------------------------------- 编辑 发表於:2001-12-31 - 21:46:07 IP: 210.53.*.* springwind 工程师 来自: 发表总数:51 查看   短消息   电子邮件 -------------------------------------------------------------------------------- 版主,恕我愚笨,接触这方面工作时间不长,但是得到了你的大力帮助。你能不能给我具体的的讲一讲。 例如我看vxworks中提供了两个函数tyRead和tyWrite,说这两个函数是与设备无关的两个函数。我想是不是可以在驱动程序中直接用这个函数,而不用再自己编写串口的读和写的程序。 -------------------------------------------------------------------------------- 编辑 发表於:2001-12-31 - 22:41:36 IP: 202.204.*.* amine 版主 来自: 发表总数:519 查看   短消息   电子邮件 -------------------------------------------------------------------------------- 我还真讲不明白, vxwork我也刚接触, MPC860我没用过, 实在是帮不上你. 但我一直使用PSOS, 里面也提供类似的函数:de_read, de_write; 它们的作用是规范接口,统一参数,分层清晰. 其实这些函数接口只是空壳, 类似Callback, 需自己填充内容, 填充需遵循设备函数接口规范, 再通过这些统一的接口使用自己实现的内容. 这些函数确实是设备无关的, 但并不是在驱动程序中使用这些函数, 而是实现它; 一般通用设备, OS会提供驱动代码, 一般不用自己从头编写, 只需稍作修改; 若实在没有现成的驱动, 也可参考OS提供驱动的模板编写. -------------------------------------------------------------------------------- 编辑 发表於:2002-01-01 - 21:09:57 IP: 210.53.*.* gyz 工程师 来自: 发表总数:60 查看   短消息   电子邮件   个人主页   OICQ -------------------------------------------------------------------------------- springwind我也是做串口驱动的,操作系统是vxworks,不过我用的是mpc850,mpc860也看了一些,希望以后多多交流。 vxworks中提供了两个函数tyRead和tyWrite,这两个函数是与设备无关的两个函数,我认为他们是由IO系统管理的,在启动时由TTY安装,在驱动程序中不直接用这两个函数,他们是在应用层由write,read调用时应用的,不用在自己编写串口的读和写的程序。这是我个人的理解,不知对你是否有用,希望以后多交流。 -------------------------------- 一起聊聊,携手共进 -------------------------------------------------------------------------------- 编辑 发表於:2002-01-07 - 19:57:38 IP: 218.21.*.* springwind 工程师 来自: 发表总数:51 查看   短消息   电子邮件 -------------------------------------------------------------------------------- 小弟我最近研究一段860的串口,也写了一个简单的scc2-scc4的串口驱动。我现在有一点心得,如果有什么错误的地方,请大侠们指出。 串口驱动程序开始要编写一个tyDrv()函数,这个函数将在usrconfig.c的usrroot()函数中调用。这个子函数中调用了硬件初始化函数和iosDrvInstall()将驱动程序加入driver list。当然我觉得函数完全可以不叫做tyDrv(),只要在usrroot()中加入相应的函数调用就行了。 至于tyRead()和tyWrite(),我觉得此函数创建了一个ring buffer,当调用write()时,将要写的字节先存入其中,然后再由中断服务中调用tyITx()将数据从ring buffer中放入bd所指的buffer中,然后要交由底层硬件在完成发送。 对于接收则是由底层硬件接收到数据后,引起一个中断,然后由中断服务程序调用tyIx()来将数据写入到ring buffer,最后由用户调用read()将其复制到指定位置。 以上是我的一点心得,请大家指点一下。 另外,gsz你好,希望以后大家多多交流,共同进步! -------------------------------------------------------------------------------- 编辑 发表於:2002-01-07 - 20:57:24 IP: 210.74.*.* gyz 工程师 来自: 发表总数:60 查看   短消息   电子邮件   个人主页   OICQ -------------------------------------------------------------------------------- 用户调用write()函数发送数据,write()调用tyWrite()函数,tyWrite()完成从用户缓冲区获取数据拷贝到输出循环缓冲区(output ring buffer),然后调用tyITx()将数据从ring buffer中放入bd所指的buffer中,如果需要由xxTxStartup()打开一个发送中断(xxTxInt()),若调用了xxTxInt()打开发送中断,那么就有xxTxInt()调用tyITx()回调从高层协议获取字节数据发送到设备,如果发送后再没有字节数据有效就复位发送中断。 用户调用read()函数接收数据,read()调用tyRead(),它首先判断输入循环缓冲区(input ring buffer)是否为空,如果不为空就把输入循环缓冲区(input ring buffer)内的数据拷贝到用户缓冲区(user buffer),完成接收。否则就调用tyIRd()回调函数产生接收中断,从设备获取数据输入到输入循环缓冲区(input ring buffer)中,然后激活tyRead()去执行,完成把数据从输入循环缓冲区拷贝数据到用户缓冲区,完成接收任务。 我以为不需要自己编写ttyDrv()函数,它是由系统提供的,只需要在usrconfig.c的usrroot()函数中调用就可以了,这个子函数中调用了硬件初始化函数和iosDrvInstall()将驱动程序加入driver list。 tyDrv是以前的老版本里用的函数,在新版本里用的是ttyDrv,它是由系统提供,只需要调用而不需要编写。 springwind 以上是我个人的心得,有可能不确切,希望指出。和大家多交流。 -------------------------------- 一起聊聊,携手共进 -------------------------------------------------------------------------------- 编辑 发表於:2002-01-07 - 23:39:19 IP: 218.21.*.* springwind 工程师 来自: 发表总数:51 查看   短消息   电子邮件 -------------------------------------------------------------------------------- gyz,你好,看过了你的发言,十分的精彩,但是我有几点不明, 请指教。 1、你所说的tyITx和tyIRx是不是在中断发生以后调用的。 2、如果你只调用ttyDrv,那么它所调用的了硬件初始化程序肯定是有统一的接口标准了, 请问个这个标准接口是什么? 3、另外我如果需要再添加SMC的串口驱动,那么我应该怎么做? -------------------------------------------------------------------------------- 编辑 发表於:2002-01-08 - 09:26:30 IP: 211.99.*.* Gao Admin 来自: 发表总数:354 查看   短消息   电子邮件   个人主页 -------------------------------------------------------------------------------- 都是高手呀,呵呵 -------------------------------------------------------------------------------- 编辑 发表於:2002-01-08 - 09:40:04 IP: 168.160.*.* 西木头 工程师 来自: 发表总数:23 查看   短消息   电子邮件 -------------------------------------------------------------------------------- gyz的解释很好,我只是对其中的“否则就调用tyIRd()回调函数产生接收中断”有点疑问? 首先我认为回调不能产生中断, 其次tty类型的驱动(ppc860Sio.c和ppc860SccSio.c)中没发现调用tyIRd(),倒是在老版本的tyCo类型的驱动(m68360Serial.c)tyCoInt()中有, ... tyIRd (&pDv->tyDev, pDv->uart.rxBdBase[pDv->uart.rxBdNext].dataPointer[0]); ... 其作用我觉得和tty中的一样,都是回调, ... (*pChan->putRcvChar) (pChan->putRcvArg,outChar); ... 最后,小弟还有一个问题要请教各位:若来一个字节中断一次,即是一次回调放一个字节在input ring buffer,那用户的read()是不是一次只能读一个字节呀?若不是,何时去读取input ring buffer呢? -------------------------------- 木头木脑,见笑了! -------------------------------------------------------------------------------- 编辑 发表於:2002-01-08 - 11:17:31 IP: 218.21.*.* gyz 工程师 来自: 发表总数:60 查看   短消息   电子邮件   个人主页   OICQ -------------------------------------------------------------------------------- 回springwind: 一、tyITx和tyIRx是在中断发生以后调用的 二、在BSP中(usrConfig.c)只调用调用ttyDrv 1、ttyDrv是一个虚拟驱动层: (1)他管理I/O系统 (2)调用真正(实际)的驱动去管理硬件 (3)他支持标准的I/O系统接口 (4)提供独立于设备的串行驱动功能 (5)可能驱动多个低级(硬件级)的串行驱动器 虚拟ttyDrv驱动和低级的实际的驱动代替老的tyCoDrv(在VxWorks5.2版本和更早的版本 )驱动 2、ttyDrv and the I/O System ttyDrv(and tyLib)管理着应用级程序和I/O系统之间的通讯,包括: (1)I/O系统请求(例如 在驱动列表中增加入口点和创建设备描述符并增加它到系统 设备链表) (2)处理所有的I/O系统入口程序。例如:ttyOpen,ttyIoctl,tyRead,tyWrite. (3)管理着selectLib调用 (4)管理着命令行编辑(see ioctl functionality in tyLib man page) (5)管理数据缓冲区。 (6)管理着缓冲区满或空的任务同步 (7)管理互斥缓冲区(Manages mutual exclusion on buffers) 3、所有和I/O系统相联系的操作都通过ttyDrv/tyLib完成 (1) ttyDrv 处理open和ioctl(ttyOpen and ttyIoctl) (2) tyLib处理 read和write(tyRead and tyWrite) (3) 没有驱动关闭程序(no close) 4、Data Flow with ttyDrv 真正的串行驱动(xxDrv)通过由ttyDrv安装的回调函数在I/O系统和设备之间去移动 数据 (1)tyLib提供回调程序(tyITx and tyIRd) (2)ttyDevCreate安装回调程序 三、另外我如果需要再添加SMC的串口驱动,那么我应该怎么做? 因为SMC与SCC有所不同,你必须令启一个程序,在头文件中定义好SMC的相关结构, 在sysserial.c中初始化SMC的结构的相应参数。SMC的具体驱动代码和SCC的差不多,可 以仿照SCC的代码来写SMC的驱动代码。 希望以上对你有用 令注:ttyDrv是由系统处理的,用户无法对其操作 -------------------------------- 一起聊聊,携手共进 -------------------------------------------------------------------------------- 编辑 发表於:2002-01-08 - 11:52:10 IP: 218.21.*.* springwind 工程师 来自: 发表总数:51 查看   短消息   电子邮件 -------------------------------------------------------------------------------- gyz,在下已拜读了你的大作, 不知你是否有这方面的专门的资料。能否让我也开开眼界。 -------------------------------------------------------------------------------- 编辑 发表於:2002-01-08 - 14:15:04 IP: 211.99.*.* bridge 工程师 来自: 发表总数:31 查看   短消息   电子邮件 -------------------------------------------------------------------------------- westwood,很久不见,还好吧。我对tty没有用过,随便说说,错了别生气。 对tty的一个read, 可以取回tty buffer中的所有内容。如果没有,就block。因此,一般来说应用程序一次read只能取回一个字符。如果需要成快的取回,就需要附加的操作。 我也有个问题在论坛上,请指点 -------------------------------------------------------------------------------- 编辑 发表於:2002-01-08 - 14:23:32 IP: 61.157.*.* gyz 工程师 来自: 发表总数:60 查看   短消息   电子邮件   个人主页   OICQ -------------------------------------------------------------------------------- 这方面的资料到是有一些,可惜是印刷版,没有电子文档,我正在整理自己的学习笔记,等我整理好后,我会贴上希望对大家有个帮助。 西木头兄说的很对,在我的上个贴子中没有说明白,回调不能产生中断,回调被调用可以是在中断中调用。具体应该是:tyWrite()完成数据拷贝后调用xxTxStartup()去启动一个发送循环,把高层协议中匹配的数据写到你的设备,如果需要的话就打开一个发送中断,写数据到设备是xxTxStartup()调用getTxChar()回调函数来完成的。如果产生中断那么就在中断中调用getTxChar()完成从高层协议获取数据到设备。 对于: tyIRd (&pDv->tyDev, pDv->uart.rxBdBase[pDv->uart.rxBdNext].dataPointer[0]); ... 其作用我觉得和tty中的一样,都是回调, ... (*pChan->putRcvChar) (pChan->putRcvArg,outChar); ... 它们的作用是一样的,以前的老版本中直接用tyIRd(),现在的新版本的都是用putRcvChar(),由putRcvChar()再调用tyIRd().最终都是用tyIRd(),用putRcvChar()只是为了实现更好的封装。 以上是个人见解 另外想问bridge,如果read一次只能获取一个字节,那么应用程序如何判断一帧的有效数据?希望各大虾指点。 -------------------------------- 一起聊聊,携手共进 -------------------------------------------------------------------------------- 编辑 发表於:2002-01-09 - 11:26:05 IP: 218.21.*.* bridge 工程师 来自: 发表总数:31 查看   短消息   电子邮件 -------------------------------------------------------------------------------- 我是说:一般是读回一个BYTE。如果DRIVER的BD BUFFER的深度是N (!= 1),那每次读回来的就可能不是1了。但是,TTY一般下层是UART,实现字符终端的功能,为了交互的实时性,BUFFER设置为1个BYTE。 个人意见,请指教



关键词: vxworks     编写     串口     驱动     老站转     工程师         

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]