中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » [求助]有DOS下搜索PCI设备的编程方法吗
作者:
标题: [求助]有DOS下搜索PCI设备的编程方法吗 上一主题 | 下一主题
taoweiwei
初级用户




积分 120
发帖 5
注册 2003-9-22
状态 离线
『楼 主』:  [求助]有DOS下搜索PCI设备的编程方法吗

a.t.t.

2003-12-4 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yixianwei
初级用户




积分 207
发帖 26
注册 2003-9-1
状态 离线
『第 2 楼』:  

采用pcibios中断。

2003-12-5 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
aria
高级用户




积分 924
发帖 243
注册 2003-7-9
状态 离线
『第 3 楼』:  

直接对端口和寄存器编程
可以参考<>这本书

2003-12-13 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
笑傲江湖
初级用户

鹰击长空


积分 271
发帖 61
注册 2003-8-20
状态 离线
『第 4 楼』:  

用汇编就可以的。



适合的,就是最好的!
DOS,永远的初恋情人。
2003-12-19 00:00
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
ldy810
新手上路





积分 13
发帖 6
注册 2005-10-6
状态 离线
『第 5 楼』:  

我写了一个程序,可以查找所有的PCI设备。

2005-10-7 21:59
查看资料  发送邮件  发短消息 网志  OICQ (280410845)  编辑帖子  回复  引用回复
ldy810
新手上路





积分 13
发帖 6
注册 2005-10-6
状态 离线
『第 6 楼』:  

PCI BIOS的中断号是0X1A你可以用它,去访问所有的PCI DEVICE,不过你要知道DEVICE NUMBER,FUNCTION NUMBER,VERNDOR ID。你用一个FOR循环,把这些地址从0开始搜索就可以啦。

2005-10-10 14:48
查看资料  发送邮件  发短消息 网志  OICQ (280410845)  编辑帖子  回复  引用回复
fire314
新手上路





积分 2
发帖 1
注册 2005-12-27
状态 离线
『第 7 楼』:  DOs下汇编实现PCI 扫瞄 SourceCode

.model  small,c

                        .386

                        .data
message1 db '---------------------------------------------------',13,10
         db 'Index Bus. Dev. func. DeviceID  VendorID DeviceType',13,10
         db '---------------------------------------------------',13,10
         db '$'
return   db 13,10,'$'
moreMessage     db 'press any key for more .',13,10,'$'
bus          db 00h
dev      db 00h
func         db 00h
bcode    db 00h
Lindex   db 00h

bc00     db 'Device built before Define BC','$'
bc01     db 'Mass Storage Controller','$'
bc02     db 'Network Controller','$'
bc03     db 'Display Controller','$'
bc04     db 'Mutimedia device','$'
bc05     db 'Memory Controller','$'
bc06     db 'Bridge device','$'
bc07     db 'Simple communication controllers','$'
bc08     db 'Base system peripherals','$'
bc09     db 'Input devices','$'
bc0a     db 'Docking stations','$'
bc0b     db 'Processors','$'
bc0c     db 'Serial bus controllers','$'
bc0d     db                   'Wireless controller','$'
bc0e     db                   'Intelligent I/O controllers','$'
bc0f     db                   'Satellite communication controllers','$'
bc10     db                   'Encryption/Decryption controllers','$'
bc11     db                   'Data acquisition and signal processing controllers','$'
BCTable  label byte
         dw offset bc00
         dw offset bc01
         dw offset bc02
         dw offset bc03
         dw offset bc04
         dw offset bc05
         dw offset bc06
         dw offset bc07
         dw offset bc08
         dw offset bc09
         dw offset bc0a
         dw offset bc0b
         dw offset bc0c
                        .stack

                        .code

;--------------------------------------------------------------------
;Display space
;
;Input        : None
;Output        : None
;--------------------------------------------------------------------

Disp_spc        proc
               
                push  dx
                push  ax

                mov   dl,20h
                mov   ah,2
                int   21h
                pop   ax
                pop   dx
               
                ret
Disp_spc        endp


;--------------------------------------------------------------------
;Display the character '0'~'9' and 'A'~'F'
;
;Input        : DL = Number
;Ouput        : None
;--------------------------------------------------------------------

Disp_chr        proc
               
                push  dx
                push  ax

                cmp   dl,10
                jns   letter
                add   dl,30h
                jmp   down
          letter:
                add   dl,37h
          down:
                mov   ah,2
                int   21h
                pop  ax
                pop  dx
               
               ret
Disp_chr        endp

;--------------------------------------------------------------------
;Display the Bus number,Device number and Function number
;
;Input        : EBX = Bus#, Dev#, Func#
;Output        : None
;--------------------------------------------------------------------

Disp_add        proc
               
               
             ;;;;;;Display Bus Number
                rol   ebx,16
                mov   dl,bl
                and   dl,0fh
                call  Disp_chr
                call  Disp_spc
                call  Disp_spc
                call  Disp_spc
                call  Disp_spc

             ;;;;;;Display Device Number
             ;;;;;;Display the high 1 bit
                rol   ebx,1
                mov   dl,bl
                and   dl,1
                call  Disp_chr
             ;;;;;;Display the low 4 bits
                rol   ebx,4
                mov   dl,bl
                and   dl,0fh
                call  Disp_chr
                call  Disp_spc
                call  Disp_spc
                call  Disp_spc
                call  Disp_spc

             ;;;;;;Display Function Number
                rol   ebx,3
                mov   dl,bl
                and   dl,7
                call  Disp_chr
                call  Disp_spc
                call  Disp_spc
                call  Disp_spc
                call  Disp_spc
                 
                 
                ret

Disp_add        endp
;------------------------------------
disp_sp  proc
          push cx
         
         mov cl,4
    p:   rol eax,4
         mov dl,al
         and dl,0fh
         call disp_chr
         
         dec cl
         jnz p
         call disp_spc
         call disp_spc
         call disp_spc
         call disp_spc
         call disp_spc

        pop  cx

          ret
disp_sp  endp
;----------------------------------------------
disp_sd  proc
         push cx
         mov cl,4
         rol eax,16
    p1:  rol eax,4
         mov dl,al
         and dl,0fh
         call disp_chr
         
         dec cl
         jnz p1
         call disp_spc
         call disp_spc
                  
         
        pop  cx

             ret
disp_sd  endp
;---------------------
;-------------------------------------------------------------------
;------------------------------------------------------------
;Start Program Here
;------------------------------------------------------------
Begin:
        ;;;;;;Display the table head
                mov   ah,9
                mov   dx,seg message1
                mov   ds,dx
                mov   dx,offset message1
                int   21h

        ;************************************************************
        ;************************************************************
                            
        ;        Add Scan PCI Code here
;loop1:
loop1:
                and   eax,00000000h
                and   ebx,00000000h
                mov   ah,dev
                mov   cl,03h
                rol   ah,cl
                add   ah,func
                mov   al,00h                ;register num.=00h
                mov   bx,ax
                mov   ax,8000h
                add   al,bus
                mov   cl,10h
                rol   eax,cl
                add   eax,ebx
                mov   ebx,eax           ;save bus#,dev#,func# in ebx
                mov   dx,0cf8h
                out   dx,eax
                mov   dx,0cfch                       
                in    eax,dx
                cmp   ax,0ffffh
;                int   3h
                jz    next2

display:
                ;;;;;;;;;Get Base ClassCode and save it in bcode memory
                push  eax
                mov   eax,ebx
                add eax,08h
                mov dx,0cf8h
                out dx,eax
                mov dx,0cfch
                in eax,dx

                mov cl,08h
                rol eax,cl
                mov bcode,al

                call Disp_spc
                call Disp_spc
                ;;;;;;;;;display the PCI Devices list index
                push    ax
                mov     al,Lindex
                mov     cl,4
                rol     al,cl
                mov     dl,al
                and     dl,0fh
                call    Disp_chr
                rol     al,cl
                mov     dl,al
                and     dl,0fh
                call    Disp_chr

                ;;;;;inc Lindex
                inc     al
                mov     Lindex,al

                pop     ax

                call    Disp_spc
                call    Disp_spc
                ;;;;;;;;;display the bus number, device number , function number
                call  disp_add
                pop   eax
                push  eax
                pop   eax
                push  eax
                call  Disp_spc
                call  disp_sp
                pop   eax
               
                call  Disp_spc
                call  disp_sd
                ;;;;;;Display Base Class Code
                push eax
                mov al,bcode
                sal al,1
                mov ah,0
                mov si, offset BCTable
                add si, ax
                mov dx,word ptr ds:[si]
                mov ah,09h
                int 21h
                pop  eax
                ;;;;;;change to a new line
                push  eax
                mov   ah,9
                mov   dx,seg return
                mov   ds,dx
                mov   dx,offset return
                int   21h
                pop   eax

                ;;;;;;;;;;;check the cusor at the bottom of the screen
                  
next2:                mov ah,func
                inc ah
                cmp ah,07h
                jg  next3
                mov func,ah
                jmp loop1

next3:          mov func,00h
                mov ah,dev
                inc ah
                cmp ah,1fh
                jg  next4
                mov dev,ah
                jmp loop1

next4:          mov func,00h
                mov dev,00h
                mov ah,bus
                inc ah
                cmp ah,0fh
                jg  N1          ;jz or jg
                mov bus,ah
                jmp loop1
        ;************************************************************
        ;************************************************************

N1:                mov   ah,4ch
                int   21h

end             Begin

2005-12-27 13:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jpzsj
初级用户





积分 43
发帖 26
注册 2005-10-7
状态 离线
『第 8 楼』:  

给一个可执行的文件啊

2006-7-12 01:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
firstsail
高级用户





积分 668
发帖 295
注册 2005-7-26
来自 广东深圳
状态 离线
『第 9 楼』:  

举一个例子(在Win98中执行):
研华的PCI-1713是一块32通道的、PCI总线的AD卡,PCI总线卡的基地址是由操作系统分配的,在一台计算中,可以插入多块相同的PCI卡。故不同的计算机硬件配置会导致PCI卡基地址是不定的。我的系统插有两块相同的PCI-1713卡。为了获得PCI-1713的基地址,程序是这样的

//研华的PCI-1713的供应商代码
#define VENDOR_ADVANTECH         0x13FEL

//研华的PCI-1713卡的设备代码
#define DEVICE_ADVANTECH_PCI1713 0x1713L


//函数功能:扫描指定格式字的PCI卡,返回多个相同格式字PCI卡的基地址。
//入口参数:dwFormat ----低16位为供应商代码,高16位为设备代码
//出口参数:pnBase1 ------ 符合指定格式字的第一块PCI卡
//出口参数:pnBase2 ------ 符合指定格式字的第二块PCI卡
//返 回 值:找到为真,否则FALSE
BOOL ScanPCI_IO(DWORD dwFormat, int* pnBase1, int* pnBase2)
{
        if (pnBase1 != NULL)  *pnBase1 = NULL;
        if (pnBase2 != NULL)  *pnBase2 = NULL;

        //i为总线号
        for (char i = 0; i < 5; i++)
        {
                //j为设备号
                for(char j=0; j < 32; j++)
                {
                        DWORD dwPCI = 0x80000000Lu + i * 0x10000Lu + (j * 8) * 0x100Lu;

                        //第0个双字
                        DWORD dwPCI_Vendor = dwPCI | (0x0 * sizeof(DWORD));
                        ::_outpd(0xcf8, dwPCI_Vendor);
                        DWORD dwDeviceAndVendor = ::_inpd(0xcfc);
                                                //判断供应商代码和设备代码是否相同
                        if (dwDeviceAndVendor !=  dwFormat)
                        {
                                continue;
                        }

                        //分析每一个基地址
                        for (int k = 0; k < 6; k++)
                        {
                                DWORD dwPCI_Base = (dwPCI | ((4 + k) * sizeof(DWORD)));
                                ::_outpd(0xcf8, dwPCI_Base);
                                DWORD dwBase = ::_inpd(0xcfc);
               
                                BOOL bMem = !(dwBase & 0x1);
                                dwBase &= 0xFFFFFFFEL;

                                //I/O,必须地址有效
                                if (!bMem && (dwBase != 0x0 && dwBase != 0xFFFFFFFEL))
                                {
                                        if (pnBase1 != NULL && *pnBase1 == 0)
                                        {
                                                *pnBase1 = (int)dwBase;

                                                if (pnBase2 == NULL)
                                                {
                                                        return(TRUE);
                                                }
                                        }
                                        else if (pnBase2 != NULL && *pnBase2 == 0)
                                        {
                                                *pnBase2 = (int)dwBase;
                                                return(TRUE);
                                        }

                                }

                        }
                       
                }
        }

        return(FALSE);
}

//获得研华PCI-1713的基地址。
//函数功能:扫描研华PCI-1713的基地址
//出口参数:pnBase1 ------ 第一块PCI-1713卡的基地址
//出口参数:pnBase2 ------ 第二块PCI-1713卡的基地址
//返 回 值:找到为真,否则FALSE

BOOL ScanAdvantech_PCI1713(int* pnBase1, int* pnBase2)
{
        return(::ScanPCI_IO(((DEVICE_ADVANTECH_PCI1713
                << 16) | VENDOR_ADVANTECH), pnBase1, pnBase2));

}

2006-7-12 12:14
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
ITU
中级用户





积分 209
发帖 82
注册 2006-3-22
状态 离线
『第 10 楼』:  

fire314:

  Quote:
Originally posted by fire314 at 2005-12-27 13:15:
.model  small,c

                        .386

                        .data
message1 db '---------------------------------------------------',13,10
         db 'Index Bus. Dev. func. DeviceI ...

这个程序在一些电脑上执行会出现许多重复的设备? 能不能修正一下这个程序?

我刚才试过的一台电脑,有一个板载网卡(接口不通),另装有一个PCI网卡,都是8139的。

测试结果如下:

Index Bus. Dev. func. Vendor:Device   DeviceType
----------------------------------------------------
  00   0    00    0     8086:2570     Bridge device
  01   0    01    0     8086:2571     Bridge device
  02   0    1D    0     8086:24D2     Serial bus controllers
  03   0    1D    1     8086:24D4     Serial bus controllers
  04   0    1D    2     8086:24D7     Serial bus controllers
  05   0    1D    3     8086:24DE     Serial bus controllers
  06   0    1D    7     8086:24DD     Serial bus controllers
  07   0    1E    0     8086:244E     Bridge device
  08   0    1F    0     8086:24D0     Bridge device
  09   0    1F    1     8086:24DB     Mass Storage Controller
  0A   0    1F    2     8086:24D1     Mass Storage Controller
  0B   0    1F    3     8086:24D3     Serial bus controllers
  0C   0    1F    5     8086:24D5     Mutimedia device
  0D   1    00    0     1002:5159     Display Controller
  0E   1    00    1     1002:5159     Display Controller
  0F   1    00    2     1002:5159     Display Controller
  10   1    00    3     1002:5159     Display Controller
  11   1    00    4     1002:5159     Display Controller
  12   1    00    5     1002:5159     Display Controller
  13   1    00    6     1002:5159     Display Controller
  14   1    00    7     1002:5159     Display Controller
  15   2    01    0     104C:8024     Serial bus controllers
  16   2    01    1     104C:8024     Serial bus controllers
  17   2    01    2     104C:8024     Serial bus controllers
  18   2    01    3     104C:8024     Serial bus controllers
  19   2    01    4     104C:8024     Serial bus controllers
  1A   2    01    5     104C:8024     Serial bus controllers
  1B   2    01    6     104C:8024     Serial bus controllers
  1C   2    01    7     104C:8024     Serial bus controllers
  1D   2    02    0     10EC:8139     Network Controller
  1E   2    09    0     10EC:8139     Network Controller
  1F   2    09    1     10EC:8139     Network Controller
  20   2    09    2     10EC:8139     Network Controller
  21   2    09    3     10EC:8139     Network Controller
  22   2    09    4     10EC:8139     Network Controller
  23   2    09    5     10EC:8139     Network Controller
  24   2    09    6     10EC:8139     Network Controller
  25   2    09    7     10EC:8139     Network Controller

它里面多出了许多个网卡的项,而实际上只有两个网卡才对。
我又用了其它的测试工具进行测试,结果都没问题。所以我觉得应该是这个程序的问题了,因为这个编译之后只有1.5K,比起同类软件小了许多,所以强烈希望能修正这个程序问题。谢谢!



另附其它工具在同一台电脑上的测试结果:

如下:


1、用PCILIST.EXE 测试的结果是:
===============================================
PC/AT PCI device list  [ PCIlist ] Version 1.36   Copyright(C) 2003-09 傑傝傕
PCI BIOS Version 2.10,  Last bus number(BIOS)=2, Configuration mechanism #1

Bus Dev Func Class      Vendor   IRQ INT B/M P/E I/O MEM MWI SER PED DPD SED CL
[0]:[ 0]     PCI--HOST  Intel     --     Yes  No  No Yes  No  No  -   -   -   -
[0]:[ 1]     GFX bridge Intel     --     Yes  No Yes Yes  No Yes  -   -   -   -
[0]:[29]:[0] USB        Intel     12 [A] Yes  No Yes  No  No  No  -   -   -   -
[0]:[29]:[1] USB        Intel      3 [B] Yes  No Yes  No  No  No  -   -   -   -
[0]:[29]:[2] USB        Intel     11 [C] Yes  No Yes  No  No  No  -   -   -   -
[0]:[29]:[3] USB        Intel     12 [A] Yes  No Yes  No  No  No  -   -   -   -
[0]:[29]:[7] USB 2.0    Intel      5 [D] Yes  No  No Yes  No  No  -   -   -   -
[0]:[30]     LPC bridge Intel     --     Yes  No Yes Yes  No Yes  -   -   -   -
[0]:[31]:[0] PCI--ISA   Intel     --     Yes  No Yes Yes  No  No  -   -   -   -
[0]:[31]:[1] IDE ctrl.  Intel     -- [A] Yes  No Yes Yes  No  No  -   -   -   -
[0]:[31]:[2] IDE ctrl.  Intel     11 [A] Yes  No Yes  No  No  No  -   -   -   -
[0]:[31]:[3] SM bus     Intel     10 [B]  No  No Yes  No  No  No  -   -   -   -
[0]:[31]:[5] MM-AUDIO   Intel     10 [B] Yes  No Yes Yes  No  No  -   -   -   -
[1]:[ 0]     VGA-VIDEO  ATI       **     Yes  No Yes Yes  No  No  -   -   -   8
[2]:[ 1]     IEEE1394   Texas Ins 10 [A] Yes  No  No Yes  No  No  -   -   -   8
[2]:[ 2]     EtherNet   RealTEK   11 [A] Yes  No Yes Yes  No  No  -   -   -   -
[2]:[ 9]     EtherNet   RealTEK   10 [A] Yes  No Yes Yes  No  No  -   -   -   -
===============================================

2、用PCISCAN.EXE 测试的结果是:
===============================================

Bus Dev Func Slot Vend Dev. Class Name           Subclass Name      
----------------------------------------------------------------
  0   0    0    0 8086 2570 Bridge               CPU/PCI            
  0   1    0    1 8086 2571 Bridge               PCI/PCI            
  0  1D    0   1D 8086 24D2 Serial Bus           USB                 
  0  1D    1   1D 8086 24D4 Serial Bus           USB                 
  0  1E    0   1E 8086 244E Bridge               PCI/PCI            
  0  1F    0   1F 8086 24D0 Bridge               PCI/ISA            
  0  1F    1   1F 8086 24DB Disk                 IDE                 
  1   0    0   20 1002 5159 Display              VGA                 
  2   1    0   41 104C 8024 Serial Bus           Firewire            
  2   2    0   42 10EC 8139 Network              Ethernet            
  2   9    0   49 10EC 8139 Network              Ethernet            
11 PCI devices found

3、用PCISLEEP.EXE 测试的结果是:
===============================================
PCI BIOS version 2.10, highest bus number is  2.
bus.device(.function) [vendor:model] classcode(/iface) vendor class [details]

BusDevf  vend:type  class   vendor     description...  
-----------------------------------------------------------------------------
00.00    8086:2570  0600    Intel      CPU host bridge
00.01    8086:2571  0604    Intel      PCI bridge [00->01]
00.1d.0  8086:24d2  0c03    Intel      USB controller
00.1d.1  8086:24d4  0c03    Intel      USB controller
00.1d.2  8086:24d7  0c03    Intel      USB controller
00.1d.3  8086:24de  0c03    Intel      USB controller
00.1d.7  8086:24dd  0c03/20 Intel      USB controller [D3]
00.1e    8086:244e  0604    Intel      PCI bridge [00->02]
00.1f.0  8086:24d0  0601    Intel      ISA bridge
00.1f.1  8086:24db  0101/8a Intel      IDE controller
00.1f.2  8086:24d1  0101/8f Intel      IDE controller
00.1f.3  8086:24d3  0c05    Intel      SMBus controller
00.1f.5  8086:24d5  0401    Intel      audio [D3]
01.00    1002:5159  0300    ATI        VGA graphics [D1,D3]
02.01    104c:8024  0c00/10 TI         FireWire IEEE1394 [D1,D3]
02.02    10ec:8139  0200    Realtek    LAN / Ethernet [D1,D3]
02.09    10ec:8139  0200    Realtek    LAN / Ethernet [D1,D3]

PCI Scan done.

===============================================

[ Last edited by ITU on 2009-12-2 at 03:23 ]

2009-12-2 03:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: