lanshenghai
驱动牛犊
驱动牛犊
  • 注册日期2002-03-24
  • 最后登录2002-04-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3573回复:15

关于PCI的I/O操作

楼主#
更多 发布于:2002-04-01 11:22
请问PCI的I/O操作在纯DOS环境下用outport/inport操作可以吗?
lynnhou
驱动牛犊
驱动牛犊
  • 注册日期2008-11-19
  • 最后登录2009-06-11
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望32点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-03-13 15:30
Dos下当然能够访问到PCI端口。对做BIOS出生的人来说,这再容易不过。只是大家没接触过。
所谓的32位地址实际上是设备所在PCI总线上的的总线号、设备号、功能号&寄存器号组合的一个32位数值(具体关于总线号,设备号,功能号&寄存器号那要看PCI SPEC和ICH SPEC(南桥))。然后把这个32位的数值写(out)到CF8h的IO中,然后再从CFCh的IO中读出的就是你要读的寄存器的数值了。
WindThruEars 提供的程式就是这个道理。
zjjmj2002
驱动小牛
驱动小牛
  • 注册日期2007-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望321点
  • 贡献值0点
  • 好评度224点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-07-17 09:07
引用第6楼Pharos于2002-04-01 18:57发表的  :
再明确的说一遍好了,在纯DOS下是绝对不可能通过I/0访问到PCI端口的,因为PCI的地址和数据寄存器是32位长的。

我也想问一个同样的问题:你为什么会要在16位环境下通过IO访问PCI呢?

16位实模式下不能读IO端口?

那BIOS启动时是怎么把硬盘上的数据读出来启动Windows喃?
lanshenghai
驱动牛犊
驱动牛犊
  • 注册日期2002-03-24
  • 最后登录2002-04-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-04 09:52
 谢谢你所提的方法。但请问到哪里能找到更详细的资料呀?特别是用PCI 9052作PCI<-->ISA时序译码的I/O读写资料?我在PLX公司的主页上没有找到相关资料。
 :)
lanshenghai
驱动牛犊
驱动牛犊
  • 注册日期2002-03-24
  • 最后登录2002-04-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-04 09:51
 谢谢你所提的方法。但请问到哪里能找到更详细的资料呀?特别是用PCI 9052作PCI<-->ISA时序译码的I/O读写资料?我在PLX公司的主页上没有找到相关资料。
WindThruEars
驱动老牛
驱动老牛
  • 注册日期2002-11-17
  • 最后登录2004-07-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-04 00:21
Really crazy,

\"在纯DOS下是绝对不可能通过I/0访问到PCI端口的,因为PCI的地址和数据寄存器是32位长的。\"?????????????????????

at least I have done that in pure DOS hundreds of times (of course the machine is 386+).

please refer to following turbo pascal code: (if your compiler or assembler supports 32bit assembly, you don\'t need be so trouble)

function lookup_hw(deviceid,func,bus:byte;index:word) : byte;
var inf:byte;

begin
  asm
    mov ax,$8000
    mov al,bus
    db $66;shl ax,16

    mov ax,index
    and ax,00fch
    mov ah,deviceid
    shl ah,3
    add ah,func

    mov dx,0cf8h
    db $66;out dx,ax

    mov ax,index
    and ax,3
    mov bl,8
    mul bl
    mov cx,ax

    mov dx,0cfch
    db $66;in ax,dx
    db $66;shr ax,cl
    mov inf,al
    mov failed,false


    db $66;xor ax,ax
    mov dx,0cf8h
    db $66;out dx,ax

  end;
  lookup_hw:=inf;
end;
我是假耳朵
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-04-03 21:06
用户被禁言,该主题自动屏蔽!
lanshenghai
驱动牛犊
驱动牛犊
  • 注册日期2002-03-24
  • 最后登录2002-04-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-03 20:07
请问WinCE是什么操作系统了?它与Windows有什么区别呀?在它上面有什么开发工具呀?
Pharos
驱动牛犊
驱动牛犊
  • 注册日期2001-08-13
  • 最后登录2005-02-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-04-03 19:58
实时是对系统来说的,如果你在这方面的要求比较高的话,那你可以用WinCE,VxWorks来试嘛。
没有我,你怎么办,你的泪水谁为你擦干; 谁为你打伞,安慰你心寒,失眠的夜你最怕孤单。
lanshenghai
驱动牛犊
驱动牛犊
  • 注册日期2002-03-24
  • 最后登录2002-04-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-04-03 19:41
因为我们公司的程序实时性要求较高,故还在DOS下编程。以前用ISA卡作控制器,但由于现在市面上的主板一般都没有ISA插槽,所以想用PCI插板来代替。
难道我们的程序只能往WINDOWS上移植码?请问有没有在WINDOWS下实时性较好的编程方法? :o
Pharos
驱动牛犊
驱动牛犊
  • 注册日期2001-08-13
  • 最后登录2005-02-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-04-01 18:57
再明确的说一遍好了,在纯DOS下是绝对不可能通过I/0访问到PCI端口的,因为PCI的地址和数据寄存器是32位长的。

我也想问一个同样的问题:你为什么会要在16位环境下通过IO访问PCI呢?
没有我,你怎么办,你的泪水谁为你擦干; 谁为你打伞,安慰你心寒,失眠的夜你最怕孤单。
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2002-04-01 18:39
用户被禁言,该主题自动屏蔽!
boyinwind
驱动牛犊
驱动牛犊
  • 注册日期2001-05-04
  • 最后登录2004-04-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-04-01 15:35
DOS有两种方法操作PCI
一种是用int 1a的方法,需要bios支持,现在的主板是没有不支持的
一种是用读写端口的方法,要用到cf8,cfc两个端口。
--阿风
lanshenghai
驱动牛犊
驱动牛犊
  • 注册日期2002-03-24
  • 最后登录2002-04-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-04-01 15:09
难道在纯DOS下,对PCI卡的I/O口就没法操作了?
 :o
Pharos
驱动牛犊
驱动牛犊
  • 注册日期2001-08-13
  • 最后登录2005-02-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-04-01 15:04
X86下PCI的端口是32bit长,所以不能在纯DOS环境下访问。
没有我,你怎么办,你的泪水谁为你擦干; 谁为你打伞,安慰你心寒,失眠的夜你最怕孤单。
drird
驱动牛犊
驱动牛犊
  • 注册日期2001-09-19
  • 最后登录2005-09-18
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-04-01 11:48
用write_port_XXXX
  read_port_XXXX
等指令!

加分吧!::---〉))) :D :D :D :D
游客

返回顶部