📄 usbpcistub.c
字号:
/* usbPciStub.c - System-specific PCI Functions for Integrator Bsps *//* Copyright 1999-2002 Wind River Systems, Inc. *//*Modification history--------------------01a,25apr02,to define PCI to CPU offset correctly.*//*DESCRIPTIONThis file defines platform-independent functions accessing PCI bus capabilities. These functions allow PCI device drivers to be written independent of the underlying O/S's PCI access mechanisms.The name of each function in this group begins with "usb" to represent"Device Driver Services."*//* Includes */#include "vxWorks.h"#include "string.h"#include "sysLib.h"#include "cacheLib.h"#include "iv.h"#include "intLib.h"/*#include "drv/pci/pciConfigLib.h"*/ /* VxWorks PCI funcs */#include "integrator.h"#include "usb/usbPlatform.h" /* Basic definitions */#include "usb/usbPciLib.h" /* Our API */#include "drv/usb/usbOhci.h" /* OHCI definitions */#define PCI_IO_OFFSET PCI2CPU_IO_OFFSET#define PCI_MEM_OFFSET PCI2DRAM_BASE_ADRS#define PCI_MEMIO_OFFSET PCI2CPU_MEM_OFFSET#define sysOutByte(addr,data) (*((UINT8 *) (addr)) = ((UINT8) (data)))#define sysOutWord(addr,data) (*((UINT16 *) (addr)) = ((UINT16) (data)))#define sysOutLong(addr,data) (*((UINT32 *) (addr)) = ((UINT32) (data)))#define sysInByte(addr) (*((UINT8 *) (addr)))#define sysInWord(addr) (*((UINT16 *) (addr)))#define sysInLong(addr) (*((UINT32 *) (addr)))#define INT_CONNECT(intNo, func, param) \ intConnect (INUM_TO_IVEC(intNo), (VOIDFUNCPTR) (func), (int) (param))#define INT_DISCONNECT(intNo, func, param)#define INT_ENABLE(i) intEnable(i)#define INT_DISABLE(i) intDisable(i)/* Map I/O functions to underlying system functions. */#define OUR_PCI_IN_BYTE(a) sysInByte ((a) + PCI_IO_OFFSET)#define OUR_PCI_IN_WORD(a) sysInWord ((a) + PCI_IO_OFFSET)#define OUR_PCI_IN_DWORD(a) sysInLong ((a) + PCI_IO_OFFSET)#define OUR_PCI_OUT_BYTE(a,v) sysOutByte ((a) + PCI_IO_OFFSET, (v))#define OUR_PCI_OUT_WORD(a,v) sysOutWord ((a) + PCI_IO_OFFSET, (v))#define OUR_PCI_OUT_DWORD(a,v) sysOutLong ((a) + PCI_IO_OFFSET, (v))/* code tracks usage count for interrupts 0..MAX_INT_NO-1. */#define MAX_INT_NO 16/* locals */LOCAL UINT16 intUsage [MAX_INT_NO] = {0};LOCAL UINT32 sysUsbInitialised;/********************************************************************************* sysUsbPciInit - perform low level pci init of all Ohci class pci devices** This routine discovers and assigns PCI resources to all installed* USB class devices. In the case of the OPTI chip, it is one device* per chip. The 4 Port Lucent chip is a multi-function device with* 4 single port USB devices/functions.** NOTE: This routine should not be called directly by the user.** RETURNS: N/A*/void sysUsbPciInit() { int nth, pciBus, pciDevice, pciFunc; /* * Initialise only once */ if( sysUsbInitialised ) return; /* * See if any USB boards are installed */ for(nth = 0; ; nth++) { /* * Look for the nth occurance of a OHCI Class device on the Pci Bus */ if (pciFindClass( ((OHCI_CLASS << 16) | (OHCI_SUBCLASS << 8) | OHCI_PGMIF), nth, &pciBus, &pciDevice, &pciFunc) == OK) { /* * Assign PCI resources to this device */ pciAssignResources(pciBus, pciDevice, pciFunc); sysUsbInitialised++; } else { /* No more devices found */ break; } } }/***************************************************************************** usbPciClassFind - Locates PCI devices by class.** A caller uses this function to locate a PCI device by its PCI class.* The caller must specify the <pciClass>, <subClass>, and <pgmIf> for the* device being sought. The function returns the first matching device* for <index> = 0, the second for <index> = 1, and so forth. The* bus number, device number, and function number for the matching device * are returned in the <pBusNo>, <pDeviceNo>, and <pFuncNo> buffers provided * by the caller. *** RETURNS: TRUE if matching device found* FALSE if device not found*/BOOL usbPciClassFind ( UINT8 pciClass, /* PCI device class */ UINT8 subClass, /* PCI device sub-class */ UINT8 pgmIf, /* Programming interface */ UINT16 index, /* Caller wants nth matching dev */ pUINT8 pBusNo, /* Bus number of matching dev */ pUINT8 pDeviceNo, /* Device number of matching dev */ pUINT8 pFuncNo /* Function number of matching dev */ ) { int intBusNo; /* VxWorks returns "int" values */ int intDeviceNo; int intFuncNo; /* Use the VxWorks PCI config. library to find a device within the specified class. */ if (pciFindClass ((pciClass << 16) | (subClass << 8) | pgmIf, index, &intBusNo, &intDeviceNo, &intFuncNo) != OK) { return FALSE; } else { if (pBusNo) *pBusNo = (UINT8) intBusNo; if (pDeviceNo) *pDeviceNo = (UINT8) intDeviceNo; if (pFuncNo) *pFuncNo = (UINT8) intFuncNo; } return TRUE; }/***************************************************************************** usbPciByteGet - Returns a UINT8 configuration value** This function returns the UINT8 value at offset <regOffset> from * the PCI configuration space of the device identified by <busNo>, * <deviceNo>, and <funcNo>.** RETURNS: UINT8 value read from device configuration space*/UINT8 usbPciByteGet ( UINT8 busNo, /* Bus number of device */ UINT8 deviceNo, /* Device number of device */ UINT8 funcNo, /* Function number of device */ UINT16 regOffset /* Offset into PCI config space */ ) { UINT8 value; if (pciConfigInByte (busNo, deviceNo, funcNo, regOffset, &value) != OK) return 0; return value; }/***************************************************************************** usbPciWordGet - Returns a UINT16 configuration value** This function returns the UINT16 value at offset <regOffset> from * the PCI configuration space of the device identified by <busNo>, * <deviceNo>, and <funcNo>.** NOTE: This function adjusts for big vs. little endian environments.** RETURNS: UINT16 value read from device configuration space*/UINT32 usbPciWordGet ( UINT8 busNo, /* Bus number of device */ UINT8 deviceNo, /* Device number of device */ UINT8 funcNo, /* Function number of device */ UINT16 regOffset /* Offset into PCI config space */ ) { UINT16 value; if (pciConfigInWord (busNo, deviceNo, funcNo, regOffset, &value) != OK) return 0; return value; }/***************************************************************************** usbPciDwordGet - Returns a UINT32 configuration value** This function returns the UINT32 value at offset <regOffset> from * the PCI configuration space of the device identified by <busNo>, * <deviceNo>, and <funcNo>.** NOTE: This function adjusts for big vs. little endian environments.** RETURNS: UINT32 value read from device configuration space*/UINT32 usbPciDwordGet ( UINT8 busNo, /* Bus number of device */ UINT8 deviceNo, /* Device number of device */ UINT8 funcNo, /* Function number of device */ UINT16 regOffset /* Offset into PCI config space */ ) { UINT32 value; if (pciConfigInLong (busNo, deviceNo, funcNo, regOffset, &value) != OK) return 0; return value; }/***************************************************************************** usbPciConfigHeaderGet - Reads a device's PCI configuration header** This function reads the PCI configuration header for the device* identified by <busNo>, <deviceNo>, and <funcNo>. The configuration* header is stored in the <pCfgHdr> buffer provided by the caller.** This function initializes the <pCfgHdr> structure to zeros. Any * fields which cannot be read from the device's configuration header * will remain zero upon return. This function does not attempt to read* fields defined as "reserved" in the PCI configuration header.** RETURNS: N/A*/VOID usbPciConfigHeaderGet ( UINT8 busNo, /* Bus number of device */ UINT8 deviceNo, /* Device number of device */ UINT8 funcNo, /* Function number of device */ pPCI_CFG_HEADER pCfgHdr /* Buffer provided by caller */ ) { int i; /* Do nothing if CfgHdr is NULL */ if (pCfgHdr == NULL) return; /* Initialize the buffer to zeros. */ memset (pCfgHdr, 0, sizeof (*pCfgHdr)); /* Read and store each field in the PCI configuration header. */ pCfgHdr->vendorId = usbPciWordGet (busNo, deviceNo, funcNo, PCI_CFG_VENDOR_ID); pCfgHdr->deviceId = usbPciWordGet (busNo, deviceNo, funcNo, PCI_CFG_DEVICE_ID); pCfgHdr->command = usbPciWordGet (busNo, deviceNo, funcNo, PCI_CFG_COMMAND); pCfgHdr->status = usbPciWordGet (busNo, deviceNo, funcNo, PCI_CFG_STATUS); pCfgHdr->revisionId = usbPciByteGet (busNo, deviceNo, funcNo, PCI_CFG_REVISION); pCfgHdr->pgmIf = usbPciByteGet (busNo, deviceNo, funcNo, PCI_CFG_PROGRAMMING_IF); pCfgHdr->subClass = usbPciByteGet (busNo, deviceNo, funcNo, PCI_CFG_SUBCLASS); pCfgHdr->pciClass = usbPciByteGet (busNo, deviceNo, funcNo, PCI_CFG_CLASS); pCfgHdr->cacheLineSize = usbPciByteGet (busNo, deviceNo, funcNo, PCI_CFG_CACHE_LINE_SIZE); pCfgHdr->latencyTimer = usbPciByteGet (busNo, deviceNo, funcNo, PCI_CFG_LATENCY_TIMER); pCfgHdr->headerType = usbPciByteGet (busNo, deviceNo, funcNo, PCI_CFG_HEADER_TYPE); pCfgHdr->bist = usbPciByteGet (busNo, deviceNo, funcNo, PCI_CFG_BIST); for (i = 0; i < PCI_CFG_NUM_BASE_REG; i++) { pCfgHdr->baseReg [i] = usbPciDwordGet (busNo, deviceNo, funcNo, PCI_CFG_BASE_ADDRESS_0 + i * sizeof (UINT32));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -