📄 pci.c
字号:
*(uint32*)PCI_HOST_CFG = swap32(0x00000007); /* setup Bar0 and 1 */ MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00) + 0x10; *(uint32*)PCI_HOST_CFG = swap32(PCI_TARG3_BAR0); MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00) + 0x14; *(uint32*)PCI_HOST_CFG = swap32(PCI_TARG3_BAR1); targ3 = PCI_OK; } else { /* it is empty */ printf("Target 3(AD19): No device found\n",cfgID); /* clear IA bit */ MCF_PCI_PCIISR |= MCF_PCI_PCIISR_IA; }/* Target Device 4 */ /* Check to see if there is anything out on Slot 4 */ /* Form config address for Slot 4*/ MCF_PCI_PCICAR = (0 | MCF_PCI_PCICAR_DEVNUM(PCI_TARG4_IDSEL)| MCF_PCI_PCICAR_FUNCNUM(0)| MCF_PCI_PCICAR_BUSNUM(0)| MCF_PCI_PCICAR_E); /* Check to see if there is anything out on Slot 4 */ MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00); cfgID = swap32(*(uint32*)PCI_HOST_CFG); if(!(MCF_PCI_PCIISR & MCF_PCI_PCIISR_IA)) { /* There is a device here... configure it */ printf("Target 4(AD20): Found Device with cfgID = 0x%08X\n",cfgID); /* set control to mem, io, and master */ MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00) + 4; *(uint32*)PCI_HOST_CFG = swap32(0x00000007); /* setup Bar0 and 1 */ MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00) + 0x10; *(uint32*)PCI_HOST_CFG = swap32(PCI_TARG4_BAR0); MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00) + 0x14; *(uint32*)PCI_HOST_CFG = swap32(PCI_TARG4_BAR1); MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00) + 0x30; *(uint32*)PCI_HOST_CFG = swap32(PCI_TARG4_BAR1+0x01000000+1); targ4 = PCI_OK; } else { /* it is empty */ printf("Target 4(AD20): No device found\n",cfgID); /* clear IA bit */ MCF_PCI_PCIISR |= MCF_PCI_PCIISR_IA; }#if 0 /* Target Device 5 */ /* Check to see if there is anything out on Slot 3 */ /* Form config address for Slot 3*/ MCF_PCI_PCICAR = (0 | MCF_PCI_PCICAR_DEVNUM(PCI_TARG5_IDSEL)| MCF_PCI_PCICAR_FUNCNUM(0)| MCF_PCI_PCICAR_BUSNUM(0)| MCF_PCI_PCICAR_E); /* Check to see if there is anything out on Slot 3 */ MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00); cfgID = swap32(*(uint32*)PCI_HOST_CFG); if(!(MCF_PCI_PCIISR & MCF_PCI_PCIISR_IA)) { /* There is a device here... configure it */ printf("Target 5(AD21): Found Device with cfgI = 0x%08X\n",cfgID); /* set control to mem, io, and master */ MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00) + 4; *(uint32*)PCI_HOST_CFG = swap32(0x00000007); /* setup Bar0 and 1 */ MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00) + 0x10; *(uint32*)PCI_HOST_CFG = swap32(PCI_TARG5_BAR0); MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00) + 0x14; *(uint32*)PCI_HOST_CFG = swap32(PCI_TARG5_BAR1); targ5 = PCI_OK; } else { /* it is empty */ printf("Target 5(AD21): No device found\n",cfgID); /* clear IA bit */ MCF_PCI_PCIISR |= MCF_PCI_PCIISR_IA; } #endif /* Target Device */ /* Check to see if we can see ourself */ /* Form config address for Slot 3*/ MCF_PCI_PCICAR = (0 | MCF_PCI_PCICAR_DEVNUM(PCI_TARG0_IDSEL)| MCF_PCI_PCICAR_FUNCNUM(0)| MCF_PCI_PCICAR_BUSNUM(0)| MCF_PCI_PCICAR_E); /* Check to see if there is anything out on Slot 3 */ MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00); cfgID = swap32(*(uint32*)PCI_HOST_CFG); if(!(MCF_PCI_PCIISR & MCF_PCI_PCIISR_IA)) { /* There is a device here... configure it */ printf("Target 0(AD16): Found Device with cfgID = 0x%08X\n",cfgID);#if 0 /* set control to mem, io, and master */ MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00) + 4; *(uint32*)PCI_HOST_CFG = swap32(0x00000007); /* setup Bar0 and 1 */ MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00) + 0x10; *(uint32*)PCI_HOST_CFG = swap32(PCI_TARG5_BAR0); MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00) + 0x14; *(uint32*)PCI_HOST_CFG = swap32(PCI_TARG5_BAR1); targ5 = PCI_OK;#endif } else { /* it is empty */ printf("Target 0(AD16): No device found\n",cfgID); /* clear IA bit */ MCF_PCI_PCIISR |= MCF_PCI_PCIISR_IA; } MCF_PCI_PCICAR &= ~(MCF_PCI_PCICAR_E); /* turn on initiator abort interrupt */ MCF_PCI_PCIICR |= MCF_PCI_PCIICR_IAE; }/*** ===================================================================** Function : pciGetVendorName**** Description : Retrieve vendor short and full names from database.** The function will return pointers to the short and ** full name of the vendor of a PCI card described by ** a filled out PCI configuration header structure.** *vendorshort and *vendorfull will point to these ** name when the function returned. Pass **vendorshort** or **vendorfull as NULL if you only need one of the** names.**** Parameters** ---------- ** -device : Pointer to a valid PCI configuration header structure.** -vendorshort: Pointer to a pointer that will point to the vendor ** short name** -vendorfull : Pointer to a pointer that will point to the vendor ** full name**** Return Value: PCI error code** ** ===================================================================*/int pciGetVendorName (pci_device * device, char **vendorshort, char **vendorfull){ int i; for (i=0; i<PCI_VENTABLE_LEN; i++) { if (PciVenTable[i].VenId == device->vendorId) { if (vendorshort != NULL) { *vendorshort = PciVenTable[i].VenShort; } if (vendorfull != NULL) { *vendorfull = PciVenTable[i].VenFull; } return PCI_OK; } } return PCI_NO_DEV;}/*** ===================================================================** Function : pciGetDevName**** Description : Retrieve device name and description from database. ** The function will return pointers to the device ** name and description of a PCI card described by a ** filled out PCI configuration header structure.** *devname and *devdesc will point to these name when** the function returned. Pass **devname or **devdesc ** as NULL if you only need one of the names.**** Parameters** ---------- ** -device : Pointer to a valid PCI configuration header structure.** -devname : Pointer to a pointer that will point to the device ** name.** -devdesc : Pointer to a pointer that will point to the device ** description.**** Return Value: PCI error code** ** ===================================================================*/int pciGetDevName (pci_device * device, char **devname, char **devdesc){ int i; for (i=0; i<PCI_DEVTABLE_LEN; i++) { if (PciDevTable[i].VenId == device->vendorId) { if (PciDevTable[i].DevId == device->deviceId) { if (devname != NULL) { *devname = PciDevTable[i].Chip; } if (devdesc != NULL) { *devdesc = PciDevTable[i].ChipDesc; } return PCI_OK; } } } return PCI_NO_DEV;}/*** ===================================================================** Function : pciGetClassName**** Description : Retrieve device class, subclass and programming ** interface description from database.** The function will return pointers to the class, ** subclass and programming interface description of a** PCI card described by a filled out PCI ** configuration header structure.**** Parameters** ---------- ** -device : Pointer to a valid PCI configuration header structure.** -basedesc : Pointer to a pointer that will point to the class** description.** -subdesc : Pointer to a pointer that will point to the subclass** description.** -progdesc : Pointer to a pointer that will point to the programming** interface description.**** Return Value: PCI error code** ** ===================================================================*/int pciGetClassName (pci_device * device, char **basedesc, char **subdesc, char **progdesc){ int i; for (i=0; i<PCI_CLASSCODETABLE_LEN; i++) { if (PciClassCodeTable[i].BaseClass == device->classCode) { if (basedesc != NULL) { *basedesc = PciClassCodeTable[i].BaseDesc; } if (PciClassCodeTable[i].SubClass == device->subClass) { if (subdesc != NULL) { *subdesc = PciClassCodeTable[i].SubDesc; } if (PciClassCodeTable[i].ProgIf == device->progIf) { if (progdesc != NULL) { *progdesc = PciClassCodeTable[i].ProgDesc; } return PCI_OK; } } } } return PCI_NO_DEV;}/*** ===================================================================** Function : pciGetConfHeader**** Description : Retrieve PCI Configuration Header from a PCI card.** The function reads the PCI Configuration Header ** from a PCI card and fills the result in the ** structure pointed to by *pciconfheader. This ** function can also be used to detect if a slot is ** populated with a PCI card. PCI_NO_DEV will be ** returned if no card is found.**** Parameters** ---------- ** -slot : Slot number (also the IDSEL AD line).** -fctnum : PCI card function to read from. Usually 0.** -pciconfheader : Pointer to a PCIConfHeader_t which will be filled.**** Return Value : PCI error code** ** ===================================================================*/int pciGetConfHeader (int slot, int fctnum, pci_device * device){ int i; unsigned int cfgID;#ifdef PCI_TEST_SMALL uint32 temp;#endif /* Check to see if there is anything out on Slot 1 */ /* Form config address for Slot 1*/ MCF_PCI_PCICAR = (0 | MCF_PCI_PCICAR_DEVNUM(slot)| MCF_PCI_PCICAR_FUNCNUM(0)| MCF_PCI_PCICAR_BUSNUM(0)| MCF_PCI_PCICAR_E); /* Check to see if there is anything out on Slot 1 */ MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00); cfgID = swap32(*(uint32*)PCI_HOST_CFG); if(!(MCF_PCI_PCIISR & MCF_PCI_PCIISR_IA)) { #ifdef PCI_TEST_SMALL for(i=0;i<16;i++) { temp = swap32(*(uint32*)PCI_HOST_CFG); printf("Reg %x value %x", i, temp); MCF_PCI_PCICAR = MCF_PCI_PCICAR + 4; }#else /* There is a device here... get header */ device->deviceId = (uint16)((cfgID & 0xFFFF0000)>>16); device->vendorId = (uint16)((cfgID & 0x0000FFFF)); MCF_PCI_PCICAR = (MCF_PCI_PCICAR & 0xFFFFFF00) + 0x04; device->status = (uint16)(((swap32(*(uint32*)PCI_HOST_CFG)) & 0xFFFF0000)>>16); device->command = (uint16)(((swap32(*(uint32*)PCI_HOST_CFG)) & 0x0000FFFF));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -