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

📄 vme2pci.c

📁 IXP425的BSP代码
💻 C
字号:
/* vme2Pci.c - VME2PCI device configuration library *//* Copyright 1984-1997 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01f,03jan97,wlf  doc: cleanup.01e,13nov96,mas  int levels read in IO space instead of config space (SPR 7475).01d,04mar96,tpr  reworked interrupt handling.01c,23feb96,tpr  added intVecNum initialization in vme2PciIntr().01b,20jan95,vin	 enhancements and clean up.01a,09jan95,kvk  created.*//*DESCRIPTIONThis library provides routines which configure the VME2PCI chip for adevice which is located on the Peripheral Component Interconnect(PCI) bus. This library has been designed with respect to the Genesis1.5 Engineering Specification Version 1.0A of MotorolaMVME1600/PM603-604 preliminary engineering specification guide.  Themacro VME2PCI_BASE_ADRS has to defined before using this library.INCLUDE FILES: vme2Pci.h*//* include files */#include "drv/intrCtl/i82378Ibc.h"#include "drv/vme/vme2Pci.h"/* extern declarations */IMPORT INT_HANDLER_DESC * sysIntTbl [256];/* locals *//* ptr to regs in PCI IO space */LOCAL ULONG 	vme2PciRegBase = VME2PCI_BASE_ADRS + VME2PCI_IO_OFFSET;/********************************************************************************* sysVme2PciInit - initialize a VME2PCI chip ** This routine initializes additional chip-specific features of a VME2PCI* chip, such as the PCI slave addresses.  It should be called only at* initialization time.** RETURNS: OK, always.*/STATUS sysVme2PciInit     (     VME2PCI_CNFG_HDR *	pVme2PciCnfgHdr,	/* ptr to VME2PCI config hdr */    ULONG 		vme2PciCnfgBase		/* ptr to VME2PCI reg base */    )    {    int 	ix;    ULONG *	cnfgPtr;    ULONG *	pVme2PciRegBase;    pVme2PciRegBase = (ULONG *)(vme2PciCnfgBase + VME2PCI_CNFG_OFFSET);    /* Program the PCI command register */        ix = sizeof (VME2PCI_CNFG_HDR) / sizeof (long);    for (cnfgPtr = (ULONG *)(pVme2PciCnfgHdr); ix > 0; cnfgPtr++, ix--)#if (_BYTE_ORDER == _BIG_ENDIAN)	*pVme2PciRegBase++ = LONGSWAP(*cnfgPtr);#else	*pVme2PciRegBase++ = *cnfgPtr;#endif /* _BYTE_ORDER == _BIG_ENDIAN */            return (OK);    }/********************************************************************************* vme2PciIntr - handle a VMEbus interrupt** This routine gets called to handle VMEbus interrupts.** NOMANUAL*/void vme2PciIntr (void)    {    UCHAR 		intVecNum = 0;    int 		vmeIntLvl;    INT_HANDLER_DESC *	currHandler;#if (_BYTE_ORDER == _BIG_ENDIAN)    vmeIntLvl = VME2PCI_INT_LVL_GET(LONGSWAP(((VME2PCI_CNFG_HDR *)				     (vme2PciRegBase))->pciIntEnable));#else    vmeIntLvl = VME2PCI_INT_LVL_GET(((VME2PCI_CNFG_HDR *)				     (vme2PciRegBase))->pciIntEnable);#endif /* _BYTE_ORDER == _BIG_ENDIAN */    switch (vmeIntLvl)	{	case 1:	/* get the vector number by reading IACK registers in VME2PCI chip */	    intVecNum = *(VME2PCI_IACK_LEVEL1);	    break;	case 2:	    intVecNum = *(VME2PCI_IACK_LEVEL2);	    break;	case 3:	    intVecNum = *(VME2PCI_IACK_LEVEL3);	    break;	case 4:	    intVecNum = *(VME2PCI_IACK_LEVEL4);	    break;	case 5:	    intVecNum = *(VME2PCI_IACK_LEVEL5);	    break;	case 6:	    intVecNum = *(VME2PCI_IACK_LEVEL6);	    break;	case 7:	    intVecNum = *(VME2PCI_IACK_LEVEL7);	    break;	}    /* call the respective interrupt handler(s) */        if ((currHandler = sysIntTbl [intVecNum]) == NULL)	logMsg ("uninitialized vme interrupt %d\n", intVecNum, 0,0,0,0,0);    else	{	while (currHandler != NULL)	    {	    currHandler->vec (currHandler->arg);	    currHandler = currHandler->next;	    }	}    }/********************************************************************************* vme2PciSlaveAddrSet - set address-related PCI features** This routine sets the Peripheral Component Interconnect (PCI) slave start* address, the PCI slave end address, and the address offset.** RETURNS: OK, always.*/STATUS vme2PciSlaveAddrSet    (    VME2PCI_CNFG_HDR *	pVme2PciCnfgHdr, 	/* ptr to VME2PCI config hdr */    ULONG *		pVme2PciRegBase,	/* ptr to VME2PCI reg base */    ULONG		startAddress,		/* slave starting address */    ULONG		endAddress,		/* ending address */    ULONG 		addrOffset,		/* slave offset */    int 		slaveNo	 		/* slave number */    )    {    int 	ix;    ULONG *	iy;        switch(slaveNo)	{	case 0:		    pVme2PciCnfgHdr->pciSlvStrtAddr1 = MSW(startAddress);	    pVme2PciCnfgHdr->pciSlvEndAddr1 = MSW(endAddress);	    pVme2PciCnfgHdr->pciSlvAddrOffset1 = MSW(addrOffset);	    pVme2PciCnfgHdr->pciSlvEnable1 = VME2PCI_SLAVE_ENABLE;	    break;	case 1:	    pVme2PciCnfgHdr->pciSlvStrtAddr2 = MSW(startAddress);	    pVme2PciCnfgHdr->pciSlvEndAddr2 = MSW(endAddress);	    pVme2PciCnfgHdr->pciSlvAddrOffset2 = MSW(addrOffset);	    pVme2PciCnfgHdr->pciSlvEnable2 = VME2PCI_SLAVE_ENABLE;	    break;		default:					    break;					}				    ix = sizeof (VME2PCI_CNFG_HDR) / sizeof (long);    for (iy = (ULONG *)(pVme2PciCnfgHdr); ix > 0; iy++, ix--)#if (_BYTE_ORDER == _BIG_ENDIAN)	*pVme2PciRegBase++ = LONGSWAP(*iy);#else	*pVme2PciRegBase++ = *iy;#endif /* _BYTE_ORDER == _BIG_ENDIAN */    return (OK);    }

⌨️ 快捷键说明

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