共1条
1/1 1 跳转至页
vxworks中编写串口驱动?(老站转)
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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |