chang_nicolas
驱动小牛
驱动小牛
  • 注册日期2004-08-26
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分370分
  • 威望39点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
阅读:1535回复:11

Xscal 串口驱动结构体问题

楼主#
更多 发布于:2005-01-24 10:37
在PPC2003系统的串口驱动中,我们把三个UART的驱动都放在同一个dll中,所以在打开串口时,就会调用open函数,在这函数里面是通过它的IoBase来区分不同的Uart的,例如
 if(pHWHead->IOBase == STUART_BASE_U_VIRTUAL)
 if(pHWHead->IOBase == BTUART_BASE_U_VIRTUAL)
但是有一点不明白,就是在init时,它是调用了init函数三次来初始化这三个Uart,结构体指针pHWHead被初始化三次,所以其成员IoBase应该是最后一次init的uart的iobase,所以每次调用open时,iobase的值应该一直是最后uart的呀,它怎么还能用它来判断呢?
不知道大家明不明白我的意思啊

简单一点说,我要用同一个uart实现两个com口的驱动(其中一个是虚拟的),那究竟怎么区分我open时调用的是哪个com口的驱动呢?
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-24 10:56
在PPC2003系统的串口驱动中,我们把三个UART的驱动都放在同一个dll中,所以在打开串口时,就会调用open函数,在这函数里面是通过它的IoBase来区分不同的Uart的,例如
 if(pHWHead->IOBase == STUART_BASE_U_VIRTUAL)
 if(pHWHead->IOBase == BTUART_BASE_U_VIRTUAL)
但是有一点不明白,就是在init时,它是调用了init函数三次来初始化这三个Uart,结构体指针pHWHead被初始化三次,所以其成员IoBase应该是最后一次init的uart的iobase,所以每次调用open时,iobase的值应该一直是最后uart的呀,它怎么还能用它来判断呢?
不知道大家明不明白我的意思啊


你在注册表里是不是配置了三个串口的注册表项啊?所以才被调用了三次啊

Come on, let us drive the world.
chang_nicolas
驱动小牛
驱动小牛
  • 注册日期2004-08-26
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分370分
  • 威望39点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-24 14:19
这个知道,不过我的意思是,IoBase的值是从注册表里读出来的,它这样连续三次init后,iobase的值应该是最后一次init后读出的值,例如是STUART吧,那么在调用open时,pHWHead->IOBase 就会是一直等于 STUART_BASE_U_VIRTUAL,怎么还能用来if(pHWHead->IOBase == BTUART_BASE_U_VIRTUAL)呢,怎么还会执行到这个if语句下面的内容呢?
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-24 16:41
这个知道,不过我的意思是,IoBase的值是从注册表里读出来的,它这样连续三次init后,iobase的值应该是最后一次init后读出的值,例如是STUART吧,那么在调用open时,pHWHead->IOBase 就会是一直等于 STUART_BASE_U_VIRTUAL,怎么还能用来if(pHWHead->IOBase == BTUART_BASE_U_VIRTUAL)呢,怎么还会执行到这个if语句下面的内容呢?


我是这么理解的:
(1)你是想用一个驱动来管理三个串口,那么这三个串口注册表项中的Prefix的值分别确定了串口的索引,三个值肯定是不一样的。
(2)你的驱动被初始化了三次,相当于被创建了三个实例,分别管理三个串口。当应用加载驱动时,只要指定是哪个串口就行了,如“COM1:”,“COM2:”,“COM3:”。

如果不对,还请高手指教!
Come on, let us drive the world.
chang_nicolas
驱动小牛
驱动小牛
  • 注册日期2004-08-26
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分370分
  • 威望39点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-24 16:53
对啊,Application调用时就是根据COM1这个来打开的,可是在驱动的open函数里面,它怎么知道上层是打开的COM1呢,而不是COM2或其他?如果假设它可以靠index来判别
例如if(index==1) {//打开com1}
if(index==2) {//打开com2}
那么这个正在使用的index是怎么获得的?
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-25 08:39
对啊,Application调用时就是根据COM1这个来打开的,可是在驱动的open函数里面,它怎么知道上层是打开的COM1呢,而不是COM2或其他?如果假设它可以靠index来判别
例如if(index==1) {//打开com1}
if(index==2) {//打开com2}
那么这个正在使用的index是怎么获得的?


我觉得这个应该是文件系统和设备管理器的任务,你不需要去理它。三个实例对应三个对应不同的设备,有不同的注册表配置。
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-25 13:44
你的XXX_OPEN函数需要返回不同的值给上层,用以区分不同的设备实例。那个pHWHead应该有三个副本。DLL的数据区默认被调用的所有进程各自创建一个副本,当然,也可以让所有的进程共享一个。
根据地的兄弟们,团结就是力量
chang_nicolas
驱动小牛
驱动小牛
  • 注册日期2004-08-26
  • 最后登录2007-03-29
  • 粉丝0
  • 关注0
  • 积分370分
  • 威望39点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-25 13:56
我觉得它是有三个副本,可是有一点不明白,open时的pHWHead指针是哪个副本的指针,从哪里获得这个指针的地址呢,它指向哪个副本啊?
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-25 14:30
每调用LOADLIBARY就会创建一个副本,从而隶属于不同的实例
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-01-25 16:38
我觉得它是有三个副本,可是有一点不明白,open时的pHWHead指针是哪个副本的指针,从哪里获得这个指针的地址呢,它指向哪个副本啊?


我再补充一下:))
(1)驱动起来之后,创建了三个驱动实例,同时创建了三个数据区副本分别用来保存对应设备的配置信息,但代码区是共享的。
(2)当应用加载驱动的时候,系统会根据你指定的设备名自动定位到对应的驱动实例,读写操作也是针对对应的数据区副本中的数据进行的,不会错误地操作其他设备的;
(3)也就是说,在驱动中你无需关心pHWHead指针到底指向哪个驱动实例,处理方式和只有一个设备实例的情况是一样的,这一点我已经测试过了:)
Come on, let us drive the world.
blackholeII
驱动牛犊
驱动牛犊
  • 注册日期2008-01-12
  • 最后登录2008-11-22
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-01-16 14:43
是通过三个类封状起来的,比如:FFUART,BTUART.STUART,不过生成一个.DLL,在驱动里有明确规定这三个串口对应哪个COM
cn_silicon
驱动牛犊
驱动牛犊
  • 注册日期2006-08-19
  • 最后登录2009-02-24
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望54点
  • 贡献值0点
  • 好评度51点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-01-17 15:14
晕倒,这个问题你仔细看看COM_OPEN就知道了,仔细看看吧
游客

返回顶部