⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pci.c

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 C
字号:
/*

  Copyright(c) 1998,1999 SIC/Hitachi,Ltd.

	Module Name:

		pci.c

	Revision History:

		26th April 1999		Released

*/

#include <windows.h>
#include "s1.h"

#define PHYSICAL_PCI_MEM		(PCI_BASE + PCI_MEM_OFFSET)		// PCI memory mapped area.
#define PHYSICAL_PCI_IO			(PCI_BASE + PCI_IO_OFFSET)		// PCI I/O area
#define PHYSICAL_PCI_CONTROL	(PCI_BASE + PCI_CONTROL_OFFSET)	// PCI control register.
#define PHYSICAL_FPG_CONTROL	P_FPGA_BASE						// FPGA control register.

#define PCI_FIRST_INSTANCE                          0x0

struct PciBaseAddresses_Type {
    unsigned PciIoReg;
    unsigned PciMemReg;
    unsigned PciControlReg;
};
struct PciDeviceType {
    USHORT  VendorID;
    USHORT  DeviceID;
    USHORT  Command;
    USHORT  Status;
    UCHAR   RevisionID;
    UCHAR   ProgrammingInterfaceCode;
    UCHAR   SubClassCode;
    UCHAR   BaseClassCode;
    UCHAR   CacheLineSize;
    UCHAR   LatencyTimer;
    UCHAR   HeaderType;
    UCHAR   BIST;
    ULONG   BaseAddressRegister[6]; 
    ULONG   CardBusInfoStructPointer;
    USHORT  SubsystemVendorID;
    USHORT  SubsystemID;
    ULONG   ExpansionROMBaseAddress;
    ULONG   PciReserve1;
    ULONG   PciReserve2;
    UCHAR   InterruptLine;
    UCHAR   InterruptPin;
    UCHAR   Min_Gnt;
    UCHAR   Max_Lat;
    ULONG   PhysicalPciIoReg;
    ULONG   PhysicalPciMemReg;
    ULONG   PhysicalPciControlReg;
    USHORT  LogInterrupt;
    ULONG   Size[6];
};

#define NO_PCI_SLOTS        3           // No of PCI slots for S1.

int PciEnumerated = FALSE;

struct PciDeviceType PciDevice[NO_PCI_SLOTS] = { 0 };

#if 1
struct PciDeviceType *PciScan(unsigned Type, unsigned Instance)
{
    unsigned int pci_wait;
    unsigned int curInstance = PCI_FIRST_INSTANCE;
    unsigned int Slot;
    unsigned int Found = FALSE;
    volatile BYTE *Cnt_vptrl;
    volatile BYTE *Mem_vptrl;
    volatile BYTE *Fpg_vptrl;
    Cnt_vptrl = (volatile BYTE *)VirtualAlloc(0,0x00800, MEM_RESERVE, PAGE_NOACCESS);
    if ( Cnt_vptrl == NULL ) {
          RETAILMSG(1, (TEXT(" Cnt_vptrl's VirtualAlloc failed !!! \r\n")));
    }else {
        if ( !VirtualCopy((PVOID)Cnt_vptrl, (PVOID)PHYSICAL_PCI_CONTROL,0x00800, PAGE_READWRITE|PAGE_NOCACHE) ) {
          RETAILMSG(1, (TEXT("!!!failed  Physical Address( 0x%08x) assinged to Virtual Address(Cnt_vptrl:0x%08x)\r\n"),PHYSICAL_PCI_CONTROL,Cnt_vptrl));
        }else {
          RETAILMSG(1, (TEXT("!!!Success Physical Address( 0x%08x) assinged to Virtual Address(Cnt_vptrl:0x%08x)\r\n"),PHYSICAL_PCI_CONTROL,Cnt_vptrl));
        }
    }
    Mem_vptrl = (volatile BYTE *)VirtualAlloc(0,0x01000000, MEM_RESERVE, PAGE_NOACCESS);
    if ( Mem_vptrl == NULL ) {
          RETAILMSG(1, (TEXT("*Mem_vptrl's VirtualAlloc failed !!! \r\n")));
    }else {
        if ( !VirtualCopy((PVOID)Mem_vptrl, (PVOID)PHYSICAL_PCI_MEM,0x01000000, PAGE_READWRITE|PAGE_NOCACHE) ) {
          RETAILMSG(1, (TEXT("!!!failed  Physical Address( 0x%08x) assinged to Virtual Address(Mem_vptrl:0x%08x)\r\n"),PHYSICAL_PCI_MEM,Mem_vptrl));
        }else {
          RETAILMSG(1, (TEXT("!!!Success Physical Address( 0x%08x) assinged to Virtual Address(Mem_vptrl:0x%08x)\r\n"),PHYSICAL_PCI_MEM,Mem_vptrl));
        }
    }
    Fpg_vptrl = (volatile BYTE *)VirtualAlloc(0,0x00100, MEM_RESERVE, PAGE_NOACCESS);
    if ( Fpg_vptrl == NULL ) {
          RETAILMSG(1, (TEXT("*Fpg_vptrl's VirtualAlloc failed !!! \r\n")));
    }else {
        if ( !VirtualCopy((PVOID)Fpg_vptrl, (PVOID)PHYSICAL_FPG_CONTROL,0x00100, PAGE_READWRITE|PAGE_NOCACHE) ) {
          RETAILMSG(1, (TEXT("!!!failed  Physical Address( 0x%08x) assinged to Virtual Address(Fpg_vptrl:0x%08x)\r\n"),PHYSICAL_FPG_CONTROL,Fpg_vptrl));
        }else {
          RETAILMSG(1, (TEXT("!!!Success Physical Address( 0x%08x) assinged to Virtual Address(Fpg_vptrl:0x%08x)\r\n"),PHYSICAL_FPG_CONTROL,Fpg_vptrl));
        }
    }
    if(!PciEnumerated) {
          PciEnumerated = TRUE;
          RETAILMSG(1, (TEXT("Write reg Address:0x%08x <--- DATAL:0x%08x)\r\n"),(Cnt_vptrl+0x005c),*(volatile unsigned long *)(Cnt_vptrl+0x005c)));
        *(volatile unsigned long *)(Cnt_vptrl+0x005c) = (unsigned long)0x000a0000;
          RETAILMSG(1, (TEXT("Write reg Address:0x%08x <--- DATAL:0x%08x)\r\n"),(volatile unsigned long *)(Cnt_vptrl+0x005c),*(volatile unsigned long *)(Cnt_vptrl+0x005c)));
        for(Slot = 0;Slot <3;Slot++)
        {
            RETAILMSG(1, (TEXT("--------------  PCI SCAN LOOP Slot =:0x%04x -------------------\r\n"),Slot));
            if( Slot == 0 ){
                *(volatile WORD *)(Fpg_vptrl+0x0004) = (volatile WORD )0x90FF;/* idsel0:9   idsel1:a   idsel0:c  */
            }else if( Slot == 1 ){
                *(volatile WORD *)(Fpg_vptrl+0x0004) = (volatile WORD )0xa0FF;/* idsel0:9   idsel1:a   idsel0:c  */
            }else if( Slot == 2 ){
                *(volatile WORD *)(Fpg_vptrl+0x0004) = (volatile WORD )0xc0FF;/* idsel0:9   idsel1:a   idsel0:c  */
            }else{
                *(volatile WORD *)(Fpg_vptrl+0x0004) = (volatile WORD )0x80FF;/* idsel0:9   idsel1:a   idsel0:c  */
            }
            #if 1
            pci_wait = 0x00000030;
            while ( --pci_wait )
            {
                *(volatile unsigned long *)(Cnt_vptrl);
            }
            #endif
            PciDevice[Slot].VendorID                    = *(volatile WORD   *)(Mem_vptrl+0x0000);
            PciDevice[Slot].DeviceID                    = *(volatile WORD   *)(Mem_vptrl+0x0002);
            PciDevice[Slot].Command                     = *(volatile WORD   *)(Mem_vptrl+0x0004);
            PciDevice[Slot].Status                      = *(volatile WORD   *)(Mem_vptrl+0x0006);
            PciDevice[Slot].RevisionID                  = *(volatile BYTE   *)(Mem_vptrl+0x0008);
            PciDevice[Slot].ProgrammingInterfaceCode    = *(volatile BYTE   *)(Mem_vptrl+0x0009);
            PciDevice[Slot].SubClassCode                = *(volatile BYTE   *)(Mem_vptrl+0x000a);
            PciDevice[Slot].BaseClassCode               = *(volatile BYTE   *)(Mem_vptrl+0x000b);

            PciDevice[Slot].CacheLineSize               = *(volatile BYTE   *)(Mem_vptrl+0x000c);
            PciDevice[Slot].LatencyTimer                = *(volatile BYTE   *)(Mem_vptrl+0x000d);
            PciDevice[Slot].HeaderType                  = *(volatile BYTE   *)(Mem_vptrl+0x000e);
            PciDevice[Slot].BIST                        = *(volatile BYTE   *)(Mem_vptrl+0x000f);

            PciDevice[Slot].BaseAddressRegister[1]      = *(volatile ULONG  *)(Mem_vptrl+0x0010);
            PciDevice[Slot].BaseAddressRegister[2]      = *(volatile ULONG  *)(Mem_vptrl+0x0014);
            PciDevice[Slot].BaseAddressRegister[3]      = *(volatile ULONG  *)(Mem_vptrl+0x0018);
            PciDevice[Slot].BaseAddressRegister[4]      = *(volatile ULONG  *)(Mem_vptrl+0x001c);
            PciDevice[Slot].BaseAddressRegister[5]      = *(volatile ULONG  *)(Mem_vptrl+0x0020);
            PciDevice[Slot].BaseAddressRegister[6]      = *(volatile ULONG  *)(Mem_vptrl+0x0024);

            PciDevice[Slot].CardBusInfoStructPointer    = *(volatile ULONG  *)(Mem_vptrl+0x0028);
            PciDevice[Slot].SubsystemVendorID           = *(volatile USHORT *)(Mem_vptrl+0x002c);
            PciDevice[Slot].SubsystemID                 = *(volatile USHORT *)(Mem_vptrl+0x002e);
            PciDevice[Slot].ExpansionROMBaseAddress     = *(volatile ULONG  *)(Mem_vptrl+0x0030);
            PciDevice[Slot].PciReserve1                 = *(volatile ULONG  *)(Mem_vptrl+0x0034);
            PciDevice[Slot].PciReserve2                 = *(volatile ULONG  *)(Mem_vptrl+0x0038);

            PciDevice[Slot].InterruptLine               = *(volatile BYTE   *)(Mem_vptrl+0x003c);
            PciDevice[Slot].InterruptPin                = *(volatile BYTE   *)(Mem_vptrl+0x003d);
            PciDevice[Slot].Min_Gnt                     = *(volatile BYTE   *)(Mem_vptrl+0x003e);
            PciDevice[Slot].Max_Lat                     = *(volatile BYTE   *)(Mem_vptrl+0x003f);
            PciDevice[Slot].PhysicalPciIoReg            = PHYSICAL_PCI_IO;
            PciDevice[Slot].PhysicalPciMemReg           = PHYSICAL_PCI_MEM;
            PciDevice[Slot].PhysicalPciControlReg       = PHYSICAL_PCI_CONTROL;
        }
        *(volatile unsigned long *)(Cnt_vptrl+0x005c) = (unsigned long)0x00060000;
        *(volatile WORD *)(Fpg_vptrl+0x0004) = (volatile WORD )0xF0FF;/* idsel0:9   idsel1:a   idsel0:c  */
        #if 1
            pci_wait = 0x00000030;
        while ( --pci_wait )
        {
           *(volatile unsigned long *)(Cnt_vptrl);
        }
        #endif
    }
    for(Slot = 0; Slot < NO_PCI_SLOTS; Slot ++) {
      DEBUGMSG(1, (TEXT("PCI: 1PciScan called. DevId = 0x%x\r\n"), PciDevice[Slot].DeviceID));
        if(PciDevice[Slot].BaseClassCode == Type) {
            if(curInstance == Instance) {
                Found = TRUE;
                DEBUGMSG(1, (TEXT("PCI: Found Instance %d of Pci Class 0x%x in Slot %d\r\n"), curInstance, Type, Slot));
                return &PciDevice[Slot];
            }
            else {
                curInstance ++;
            }
        }
    }
    DEBUGMSG(1, (TEXT("PCI: Unable to locate Instance %d of Pci Class 0x%x in all Slots.\r\n"), Instance, Type));
    return (struct PciDeviceType *)NULL;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -