sosoln
驱动牛犊
驱动牛犊
  • 注册日期2001-09-26
  • 最后登录2005-01-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2241回复:4

求助,dos下的PCI板卡驱动。

楼主#
更多 发布于:2001-09-27 12:32
我在DOS下驱动PLX 9052,但是不能接受到中断。

我遇到的问题有下面几个:
1)我自己的dos程序取读PCI配置空间的六个地址时,只有地址1(从0期)有数据(端口地址),可是WINDRIVER能测出两个内存映像,请问我怎么才能得到内存映像呢?我只能得到端口地址,端口编程来驱动也可以吧?
2)我自己编的程序,不能接受到板卡产生的中断,可是 windriver能,不知道为什么?我用了setvect、和8259的操作。按理,windriver能做的,我也可以啊。我少些什么呢?我模拟生成该中断,geninterrupt,我的程序能接受到中断。
3) 我对plx 9052设置的仅仅是intcsr。是不是不够?
4) 我在他的机器上试,能做到上面这些步,可是当我拿到我自己的机器上时(P4,精英主板,award bios),在win 2000下windriver能找到,win2000的dos中不能找到pci_bios,win98中,windriver能找到plx 9052,但是六个地址都是0,相应的dos中我的程序也是六个0。


谢谢。
我飞来飞去,我飞来飞去???
matt
驱动中牛
驱动中牛
  • 注册日期2001-07-24
  • 最后登录2016-02-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-09-29 14:58
你用什么方式读的pci configuratoin? (1,pci bios:int 1ah 2, 直接端品访问 0xcf8 - 0xcfc)?换种方式试试!

IRQ和软件中断int不是一回事,在dos下,irq0-7对应int 8-f,
irq 8-f对应int 70-7f。

以上信息或许有帮助!

Matt Wu
System Internals http://sys.xiloo.com
sosoln
驱动牛犊
驱动牛犊
  • 注册日期2001-09-26
  • 最后登录2005-01-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-09-29 16:28
matt你好,:) 能和你多交流一下么?

1. 第一个问题,我明白了一部分,dos是16位的,而bios给pci分配的内存映射空间一般都是0xe0000000之类的,所以dos取得的地址其实就是0,无效。所以,我感觉,如果不用特殊手段的话,恐怕在dos下只有端口访问PCI BAR一种方式了。我用的方式是int 1AH.我当时是在98的dos环境下,我用我的程序修改local register area部分的寄存器,例如intcsr,同时我用windriver测,发现确实测到了我改变的值。你说的用端口读取pci的我也可以试试。

2. 中断还是没有产生。我感觉很奇怪,我的做法和你说的相似,是加了8H或者70H的。我把中断号改成1ch,就是时钟中断,能够调用我这个。也许这不能说明什么。
我对中断部分操作的就是如下:
设置/取消中断:
setvect,...
outp(0x21 或者 0xa1,...)
中断服务程序:
outp(0x20获0xa0, 0x20)

3. 中断就是不能在我的dos程序下被接受,为什么呢?请问你有dos下的pci程序的例子么?其实我这个程序是参照amcc 5933的举例程序改的,没想到会这样,今年2月份我编了使用5933的一块板卡的linux驱动,成功了。不想现在死在dos手里了。。。。现在是给朋友编,他也着急。

帮忙啊!


我飞来飞去,我飞来飞去???
matt
驱动中牛
驱动中牛
  • 注册日期2001-07-24
  • 最后登录2016-02-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-09-29 17:02
[QUOTE]原本由 sosoln 发表
[B]matt你好,:) 能和你多交流一下么?

1. 第一个问题,我明白了一部分,dos是16位的,而bios给pci分配
2. 中断还是没有产生。我感觉很奇怪,我的做法和你说的相似,是加了8H或者70H的。我把中断号改成1ch,就是时钟中断,能够调用我这个。也许这不能说明什么。
我对中断部分操作的就是如下:
设置/取消中断:
setvect,...
outp(0x21 或者 0xa1,...)
中断服务程序:
outp(0x20获0xa0, 0x20)
 [/B][/QUOTE]

第一个问题,好像可以解决,比如int 15h,或protect mode。
对第二个问题,我很迷惑,你为什么必为1ch呢?从pci config中读出irq line,然后加上08h或70h,然后再*4,即得int vector address,是这个过程吗?

还有一点,在start之前,利用outp(0x21 或者 0xa1,...)清空IRR对应你申请的中断所在的位。

Matt Wu
System Internals http://sys.xiloo.com
sosoln
驱动牛犊
驱动牛犊
  • 注册日期2001-09-26
  • 最后登录2005-01-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-09-30 12:12
看来,我还是没有查那么多资料。你说的那几点我没有注意。
1ch 是我tc 2.0的程序来测测中断向量对不对的,没有别的意思。
int_vector = irq + 0x8 (or 0x70)
然后我用的是setvector(int_vector),没有*4,这一点似乎没有错。
我套的是amcc的三个文件,我恐怕需要查查pci的bios调用了。

http://www.amcc.com/Products/Pci/Dmacodec.txt
http://www.amcc.com/Products/Pci/Amcclibc.txt
http://www.amcc.com/Products/Pci/Amcch.txt


谢谢,:)我再调调。

我飞来飞去,我飞来飞去???
游客

返回顶部