PCI访问完整代码

读取PCI,BUS 0,DEV 0,FUN 0配置空间中完整的256字节的数据:

#include <stdio.h>  
#include <dos.h>  
#include <conio.h>  
#include <bios.h>  
  
  
int a[16][16];  
void output()/*矩阵输出*/  
{  
  
    int i,j,h;  
    clrscr();  
    printf("  ");  
    for(i = 1;i<17;i++)  
    {  
        a[0][i] = i-1;  
        printf(" %02x",a[0][i]);  
    }  
    printf("\n");  
    for(j = 0;j<16;j++)  
    {  
        a[j+1][0] = j;  
        printf("%02x",a[j+1][0]);  
        for(h = 1;h<17;h++)  
        {  
            printf(" %02x",a[j+1][h]);  
        }  
        printf("\n");  
    }     
  
}  
unsigned long int get(unsigned long int Addr)/*寻址读取数据*/  
{  
    unsigned long int data;  
    asm mov dx,0xcf8     
    asm db 0x66     
    asm mov ax, Addr  
    asm db 0x66     
    asm out dx,ax     
    asm mov dx,0xcfc     
    asm db 0x66     
    asm in ax,dx     
    asm db 0x66     
    asm mov data,ax  
    return data;  
}  
  
void main()  
{  
    int n,m,k,l;  
    int offset;  
    unsigned long int Addr,Bus,Dev,Fun,data,ll,lh,hl,hh;  
    unsigned long int Baseaddress;  
    offset = 0;  
    Baseaddress = 0x80000000;  
    Bus = 0;  
    Dev = 0;  
    Fun = 0;  
    l = 0;  
    m = 1;  
    for(n = 0;n<64;n++)  
    {  
        Addr = Baseaddress+(Bus<<16)+(Dev<<11)+(Fun<<8)+offset;  
        data = get(Addr);  
        offset = offset+4;  
        ll = data&0x000000ff;/*将32位数据拆减成8位输出*/  
        lh = (data>>8)&0x0000ff;  
        hl = (data>>16)&0x00ff;  
        hh = (data>>24)&0xff;  
        a[m][l*4+1] = ll;  
        a[m][l*4+2] = lh;  
        a[m][l*4+3] = hl;  
        a[m][l*4+4] = hh;  
        l++;  
        if(0 == n%4&& 0 != n)  
        {  
            m++;  
            l = l-4;  
        }  
    }  
   output();  
   getch();  
}  

 

posted on 2018-02-27 21:23  米兰达莫西  阅读(629)  评论(0编辑  收藏  举报