syswindml.c
来自「cpc-1631的BSP包for VxWorks操作系统」· C语言 代码 · 共 545 行 · 第 1/2 页
C
545 行
if (pciConfigInWord (busno, devno, funcno, PCI_CFG_VENDOR_ID, &data) != OK)
return(pDev);
vendorID = data;
if (pciConfigInWord (busno, devno, funcno, PCI_CFG_DEVICE_ID, &data) != OK)
return(pDev);
deviceID = data;
} else
{
if (pciFindDevice (vendorID, deviceID, instance,
&busno, &devno, &funcno) != OK)
return(pDev);
}
pDev = (WINDML_DEVICE *)KHEAP_ALLOC(sizeof(WINDML_DEVICE));
bzero ((char *)pDev,sizeof(WINDML_DEVICE));
if (pDev == NULL)
return(pDev);
pDev->vendorID = vendorID;
pDev->deviceID = deviceID;
pDev->instance = instance;
pciConfigInLong (busno, devno, funcno, PCI_CFG_BASE_ADDRESS_0, &bar);
pDev->pPhysBaseAdrs0 = (void *) bar;
pciConfigInLong (busno, devno, funcno, PCI_CFG_BASE_ADDRESS_1, &bar);
pDev->pPhysBaseAdrs1 = (void *) bar;
pciConfigInLong (busno, devno, funcno, PCI_CFG_BASE_ADDRESS_2, &bar);
pDev->pPhysBaseAdrs2 = (void *) bar;
pciConfigInLong (busno, devno, funcno, PCI_CFG_BASE_ADDRESS_3, &bar);
pDev->pPhysBaseAdrs3 = (void *) bar;
pciConfigInLong (busno, devno, funcno, PCI_CFG_BASE_ADDRESS_4, &bar);
pDev->pPhysBaseAdrs4 = (void *) bar;
pciConfigInLong (busno, devno, funcno, PCI_CFG_BASE_ADDRESS_5, &bar);
pDev->pPhysBaseAdrs5 = (void *) bar;
pDev->devType = devType;
pDev->busType = BUS_TYPE_PCI;
pciConfigInByte (busno, devno, funcno, PCI_CFG_DEV_INT_PIN, &intLine);
if (intLine == 0)
{
free(pDev);
pDev = NULL;
return(pDev);
}
pDev->intLevel = intLine;
pDev->intVector = (void *)(INT_VEC_GET(intLine));
break;
}
#endif /* INCLUDE_PCI */
default:
break;
}
return(pDev);
}
/*******************************************************************************
*
* sysWindMLDevCtrl - special control of the device mode
*
* This routine provides special control features for the device. This
* function is essentially a catch all to provide control of the device
* where the functionality is provided within a PCI configuration header or
* by board specific registers which may be shared by other functions implemented
* on the target board.
*
* The <function> argument defines the type of function that is to be
* performed and the <pArg> parameter provides the details relating to the
* function.
*
* The values for <function> and the interpretation of the <pArg> parameters
* are:
*
*\is
*\i WINDML_ACCESS_MODE_SET
* Sets the device's access mode as to whether it is to respond to I/O
* cycles of memory mapped cycles or both. The accessibility is
* provided by the <pArg> parameter which is bit mapped containing the
* flags WINDML_MEM_ENABLE (enable memory mapped access) and
* WINDML_IO_ENABLE (enable I/O access).
*\i WINDML_LCD_MODE_SET
* Sets the control mode for an LCD that is controllable by an on board
* register rather than a graphics device register. The mode information
* is passed through <pArg>. The flags available are WINDML_LCD_ON
* WINDML_LCD_OFF, WINDML_BACKLIGHT_ON, WINDML_BACKLIGHT_OFF.
*\i WINDML_BUSWIDTH_SET
* Some boards allow the LCD bus width to be changed dynamically via
* an FPGA or other configurable logic. This can be done in a board
* specific manner. The actual bus width will be passed through <pArg>.
*\i WINDML_PCI_MEMBASE_GET
* Obtain the base address of CPU memory as seen by PCI devices.
*\ie
*
* RETURNS: OK when control operation was success; otherwise ERROR
*/
STATUS sysWindMLDevCtrl
(
WINDML_DEVICE * pDev, /* Device to control */
int function, /* Type of operation to perform */
int * pArg /* Control mode */
)
{
STATUS status = ERROR;
if (pDev == NULL)
{
return (status);
}
switch (function)
{
/* Conrol the PCI access mode, the command byte */
#ifdef INCLUDE_PCI
case WINDML_ACCESS_MODE_SET:
{
int busno, devno, funcno;
if (pciFindDevice (pDev->vendorID,
pDev->deviceID,
pDev->instance,
&busno, &devno, &funcno) != OK)
return (ERROR);
status = pciConfigOutWord (busno, devno, funcno,
PCI_CFG_COMMAND, *pArg);
break;
}
/* Obtain the CPU memory base address as seen by PCI device */
case WINDML_PCI_MEMBASE_GET:
/* PCI memory base is same as CPU, so set to 0 */
*pArg = 0;
break;
#endif /* INCLUDE_PCI */
default:
break;
}
return (status);
}
/*******************************************************************************
*
* sysWindMLDevRelease - release a device configuration
*
* This routine will release any resources that were allocated when a
* device was configured using the <sysWindMLDevGet()> function. This
* function will free the memory that was allocated for the WINDML_DEVICE
* data structure if it was dynamically allocated. If the data structure
* was not dynamically allocated, this function will usually be simply a
* stub.
*
* RETURNS: OK when operation was success; otherwise ERROR
*/
STATUS sysWindMLDevRelease
(
WINDML_DEVICE * pDev /* Device to release */
)
{
if (pDev != NULL)
{
KHEAP_FREE ((char *) pDev);
}
return (OK);
}
/*******************************************************************************
*
* sysWindMLIntConnect - Connect the device interrupt.
*
* This routine connects a routine to the interrupt.
*
* RETURNS: OK or ERROR
*/
STATUS sysWindMLIntConnect
(
WINDML_DEVICE * pDev, /* Graphics device to control */
VOIDFUNCPTR routine, /* routine to be called */
int parameter /* parameter to be passed */
)
{
STATUS status = ERROR;
if (pDev != NULL && pDev->intVector != NULL && routine != NULL)
{
if (pDev->busType == BUS_TYPE_PCI)
{
#ifdef INCLUDE_PCI
status = pciIntConnect (pDev->intVector, routine, parameter);
#endif /* INCLUDE_PCI */
}
else
status = intConnect (pDev->intVector, routine, parameter);
}
return (status);
}
/*******************************************************************************
*
* sysWindMLIntEnable - Enable interrupts.
*
* This routine enables the interrupt.
*
* RETURNS: OK or ERROR
*/
STATUS sysWindMLIntEnable
(
WINDML_DEVICE * pDev /* Device to control */
)
{
STATUS status = ERROR;
if (pDev != NULL && pDev->intLevel != 0)
{
status = sysIntEnablePIC (pDev->intLevel);
}
return (status);
}
/*******************************************************************************
*
* sysWindMLIntDisable - Disable interrupts.
*
* This routine disables the interrupt.
*
* RETURNS: OK or ERROR
*/
STATUS sysWindMLIntDisable
(
WINDML_DEVICE * pDev /* Device to control */
)
{
STATUS status = ERROR;
if (pDev != NULL && pDev->intLevel != 0)
{
#ifdef SANDPOINT_BSP
status = sysIntDisable(pDev->intLevel);
#else
status = sysIntDisablePIC (pDev->intLevel);
#endif /* SANDPOINT_BSP */
}
return (status);
}
/*******************************************************************************
*
* sysWindMLHwInit - Perform any necessary hardware initialization in sysHwInit()
*
* RETURNS: OK or ERROR
*/
STATUS sysWindMLHwInit
(
void
)
{
return(OK);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?