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

📄 mot85xxpci.c

📁 Freescale MPC85xx BSP (8555/8541)。绝对可用的。
💻 C
字号:
/* mot85xxPci.c - Motorola ads 85xx PCI Bridge functions *//* * Copyright (c) 2003-2005 Wind River Systems, Inc. * * The right to copy, distribute or otherwise make use of this software * may be licensed only pursuant to the terms of an applicable Wind River * license agreement. No license to Wind River intellectual property rights * is granted herein. All rights not licensed by Wind River are reserved * by Wind River. */#include "copyright_wrs.h"/*modification history--------------------01f,24mar05,mdo  Documentation fixes for apigen01e,22mar05,dtr  Fix typos.01d,28oct04,jln  add PCI2 support on cds85xx01c,04aug03,dtr  Move LAWAR2 to LAWAR3.01b,30jul03,dtr  Fixing some magic numbers and setting PCI snoop.01a,04jul02,dtr  File created.*//* PCI Host Bridge setup File *//*DESCRIPTIONINCLUDE FILES:*/#include "vxWorks.h"#include "config.h"#include "sysLib.h"#include "drv/pci/pciConfigLib.h" 	#include "drv/pci/pciIntLib.h" 	#include "drv/pci/pciAutoConfigLib.h"	#include "sysBusPci.h"#include "mot85xxPci.h"#define MAX_NUM_VECTORS 4UINT32 pciRegRead(UINT32 *adrs);void   pciRegWrite(UINT32 *adrs,UINT32 value);void pciConfigTest();#define PCI_REG_READ  pciRegRead#define PCI_REG_WRITE  pciRegWrite/************************************************************************** * mot85xxBridgeInit - initialize the PCI bridge** This function performs all the initialisation required for the * Bridge/Interrupts/PCI Bus to function. It does some low level processor* initialisation which might normally be done in romInit as it is optional * to do use this and shows what the core changes required to bring up the * bridge.* * RETURNS: N/A** ERRNO*/void mot85xxBridgeInit(void)    {    STATUS          result;    volatile UINT32 valRead;    /* Initialise LAWBAR/LAWAR for PCI */    *M85XX_LAWBAR4(CCSBAR) = PCI_LAW_BASE >> LAWBAR_ADRS_SHIFT;    *M85XX_LAWAR4(CCSBAR)  = LAWAR_ENABLE | LAWAR_TGTIF_PCI | PCI_LAW_WIN_SZ;#ifdef INCLUDE_CDS85XX_SECONDARY_PCI    *M85XX_LAWBAR5(CCSBAR) = PCI2_LAW_BASE >> LAWBAR_ADRS_SHIFT;    *M85XX_LAWAR5(CCSBAR)  = LAWAR_ENABLE | LAWAR_TGTIF_PCI2 | PCI2_LAW_WIN_SZ;    valRead =  *M85XX_LAWAR5(CCSBAR);#else    valRead =  *M85XX_LAWAR4(CCSBAR);#endif /* INCLUDE_CDS85XX_SECONDARY_PCI */      WRS_ASM("isync");      /* Set outbound translation window addresses */      sysPciConfigEnable (CDS85XX_PCI_1_BUS);         result = sysPciConfigWrite(0,0,0,				 PCI_CFG_BASE_ADDRESS_0,				 0x4,				 PCI_BRIDGE_PIMMR_BASE_ADRS);      /* for PCI 1 */      PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_BASE_ADRS_REG0(CCSBAR)),		    (CPU_PCI_MEM_ADRS>>12) & 0xfffff);      PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_TRANS_ADRS_REG0(CCSBAR)),		    (PCI_MEM_ADRS>>12) & 0xfffff);      PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_BASE_ADRS_REG1(CCSBAR)),		    (CPU_PCI_MEMIO_ADRS>>12) & 0xfffff);      PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_TRANS_ADRS_REG1(CCSBAR)),		    (PCI_MEMIO_ADRS>>12) & 0xfffff);      PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_BASE_ADRS_REG2(CCSBAR)),		    (CPU_PCI_IO_ADRS>>12) & 0xfffff);      PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_TRANS_ADRS_REG2(CCSBAR)),		    (PCI_IO_ADRS>>12) & 0xfffff);      PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_ATTR_REG0(CCSBAR)),		    PCI_WINDOW_ENABLE_BIT | PCI_OUT_ATTR_RTT_MEM | \                    PCI_OUT_ATTR_WTT_MEM | PCI_MEM_SIZE_MASK);      PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_ATTR_REG1(CCSBAR)),		    PCI_WINDOW_ENABLE_BIT |PCI_OUT_ATTR_RTT_MEM | \                    PCI_OUT_ATTR_WTT_MEM | PCI_MEMIO_SIZE_MASK);      PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_ATTR_REG2(CCSBAR)),		    PCI_WINDOW_ENABLE_BIT |PCI_OUT_ATTR_RTT_IO | \                    PCI_OUT_ATTR_WTT_IO | PCI_IO_SIZE_MASK);      /* Switch on the inbound windows */      PCI_REG_WRITE((UINT32*)(PCI_INBOUND_BASE_ADRS_REG1(CCSBAR)),		    (PCI_MSTR_MEM_BUS>>12) & 0xfffff);      PCI_REG_WRITE((UINT32*)(PCI_INBOUND_TRANS_ADRS_REG1(CCSBAR)),		    (LOCAL_MEM_LOCAL_ADRS>>12) & 0xfffff);			        PCI_REG_WRITE((UINT32*)(PCI_INBOUND_ATTR_REG1(CCSBAR)),		    PCI_WINDOW_ENABLE_BIT | \		    PCI_IN_ATTR_RTT_LM_READ_SNOOP | \                    PCI_IN_ATTR_RTT_LM_WRITE_SNOOP | PCI_IN_ATTR_TGI_LM | 		    PCI_LOCAL_MEM_SIZE_MASK);      PCI_REG_WRITE((UINT32*)(PCI_INBOUND_ATTR_REG2(CCSBAR)),		    PCI_IN_ATTR_RTT_LM_READ_SNOOP | \                    PCI_IN_ATTR_RTT_LM_WRITE_SNOOP | PCI_IN_ATTR_TGI_LM | PCI_LOCAL_MEM_SIZE_MASK);      PCI_REG_WRITE((UINT32*)(PCI_INBOUND_ATTR_REG3(CCSBAR)),		    PCI_IN_ATTR_RTT_LM_READ_SNOOP | \                    PCI_IN_ATTR_RTT_LM_WRITE_SNOOP | PCI_IN_ATTR_TGI_LM | PCI_LOCAL_MEM_SIZE_MASK);      /* configure the bridge as bus master */      result = sysPciConfigWrite(0,0,0,				 COMMAND_REGISTER_OFFSET,				 COMMAND_REGISTER_WIDTH,				 PCI_CMD_IO_ENABLE |				 PCI_CMD_MEM_ENABLE | 				 PCI_CMD_MASTER_ENABLE);      WRS_ASM("sync;eieio");#ifdef INCLUDE_CDS85XX_SECONDARY_PCI      sysPciConfigEnable (CDS85XX_PCI_2_BUS);      /* for PCI 2 */      PCI_REG_WRITE((UINT32*)(PCI2_OUTBOUND_BASE_ADRS_REG0(CCSBAR)),		    (CPU_PCI_MEM_ADRS2>>12) & 0xfffff);      PCI_REG_WRITE((UINT32*)(PCI2_OUTBOUND_TRANS_ADRS_REG0(CCSBAR)),		    (PCI_MEM_ADRS2>>12) & 0xfffff);      PCI_REG_WRITE((UINT32*)(PCI2_OUTBOUND_BASE_ADRS_REG1(CCSBAR)),		    (CPU_PCI_MEMIO_ADRS2>>12) & 0xfffff);      PCI_REG_WRITE((UINT32*)(PCI2_OUTBOUND_TRANS_ADRS_REG1(CCSBAR)),		    (PCI_MEMIO_ADRS2>>12) & 0xfffff);      PCI_REG_WRITE((UINT32*)(PCI2_OUTBOUND_BASE_ADRS_REG2(CCSBAR)),		    (CPU_PCI_IO_ADRS2>>12) & 0xfffff);      PCI_REG_WRITE((UINT32*)(PCI2_OUTBOUND_TRANS_ADRS_REG2(CCSBAR)),		    (PCI_IO_ADRS2>>12) & 0xfffff);      PCI_REG_WRITE((UINT32*)(PCI2_OUTBOUND_ATTR_REG0(CCSBAR)),		    PCI_WINDOW_ENABLE_BIT | PCI_OUT_ATTR_RTT_MEM | \                    PCI_OUT_ATTR_WTT_MEM | PCI_MEM_SIZE_MASK);      PCI_REG_WRITE((UINT32*)(PCI2_OUTBOUND_ATTR_REG1(CCSBAR)),		    PCI_WINDOW_ENABLE_BIT |PCI_OUT_ATTR_RTT_MEM | \                    PCI_OUT_ATTR_WTT_MEM | PCI_MEMIO_SIZE_MASK);      PCI_REG_WRITE((UINT32*)(PCI2_OUTBOUND_ATTR_REG2(CCSBAR)),		    PCI_WINDOW_ENABLE_BIT |PCI_OUT_ATTR_RTT_IO | \                    PCI_OUT_ATTR_WTT_IO | PCI_IO_SIZE_MASK);      /* Switch on the inbound windows */      PCI_REG_WRITE((UINT32*)(PCI2_INBOUND_BASE_ADRS_REG1(CCSBAR)),		    (PCI_MSTR_MEM_BUS>>12) & 0xfffff);      PCI_REG_WRITE((UINT32*)(PCI2_INBOUND_TRANS_ADRS_REG1(CCSBAR)),		    (LOCAL_MEM_LOCAL_ADRS>>12) & 0xfffff);			        PCI_REG_WRITE((UINT32*)(PCI2_INBOUND_ATTR_REG1(CCSBAR)),		    PCI_WINDOW_ENABLE_BIT | \		    PCI_IN_ATTR_RTT_LM_READ_SNOOP | \                    PCI_IN_ATTR_RTT_LM_WRITE_SNOOP | PCI_IN_ATTR_TGI_LM | 		    PCI_LOCAL_MEM_SIZE_MASK);      PCI_REG_WRITE((UINT32*)(PCI2_INBOUND_ATTR_REG2(CCSBAR)),		    PCI_IN_ATTR_RTT_LM_READ_SNOOP | \                    PCI_IN_ATTR_RTT_LM_WRITE_SNOOP | PCI_IN_ATTR_TGI_LM | PCI_LOCAL_MEM_SIZE_MASK);      PCI_REG_WRITE((UINT32*)(PCI2_INBOUND_ATTR_REG3(CCSBAR)),		    PCI_IN_ATTR_RTT_LM_READ_SNOOP | \                    PCI_IN_ATTR_RTT_LM_WRITE_SNOOP | PCI_IN_ATTR_TGI_LM | PCI_LOCAL_MEM_SIZE_MASK);      result = sysPciConfigWrite(0,0,0,				 COMMAND_REGISTER_OFFSET,				 COMMAND_REGISTER_WIDTH,				 PCI_CMD_IO_ENABLE |				 PCI_CMD_MEM_ENABLE | 				 PCI_CMD_MASTER_ENABLE);      WRS_ASM("sync;eieio");      /* change to default PCI system 1 */      sysPciConfigEnable (CDS85XX_PCI_1_BUS);#endif /* INCLUDE_CDS85XX_SECONDARY_PCI */    }/************************************************************* pciRegWrite - write to memory-map PCI registers** This function write ATMU registers for PCI.* * RETURNS: N/A** ERRNO*/ void pciRegWrite    (    UINT32 *adrs,    UINT32 value    )    {    *adrs = value;    WRS_ASM("sync;eieio");    }/************************************************************* pciRegRead - read from memory-map PCI registers** This function read ATMU registers for PCI.* * RETURNS: N/A** ERRNO*/UINT32 pciRegRead    (    UINT32 *adrs    )    {    return (*adrs);    }/************************************************************ pciConfigTest - dump on-chip PCI configuration header** This function print out PCI configuration header.* * RETURNS: N/A** ERRNO*/void pciConfigTest    (    int pciSys    )    {    int loop;    UINT32 var;    if (pciSys == CDS85XX_PCI_2_BUS)        sysPciConfigEnable (CDS85XX_PCI_2_BUS);    else        sysPciConfigEnable (CDS85XX_PCI_1_BUS);    for(loop = 0; loop < 0x40; loop += 4)        {        sysPciConfigRead(0,0,0,loop,0x4,&var);        printf("Word %d Value %x\n",loop,var);        }    }

⌨️ 快捷键说明

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