Now i try to develop a simple PCIe device.
I read below code and document.
C:\ti\mcsdk_2_01_02_06\tools\boot_loader\ibl\src\device\c665x\c665xinit.c - void iblPCIeWorkaround()
and
PCIe Use Cases for KeyStone Devices (SPRABK8—December 2011) - 5 PCIe Programming Example
My device detected by Windows 7 PC as Multimedia Controller.
But BAR0,1 is unexpected.
In C6657, I set 0x00000000 to BAR0 (0x1010). My device can't be detected by Windows PC.
In Windows PC, I set 0x70000000 to BAR0 (0x1010). Read value is not same to value at 0x00800000.
Are there any parameters that are wrong ?
Or Procedure is wrong?
void main (void) { uint32 i; uint32 reg; memset (&iblStatus, 0, sizeof(iblStatus_t)); iblStatus.iblMagic = ibl_MAGIC_VALUE; iblStatus.iblVersion = ibl_VERSION; iblStatus.activeDevice = ibl_ACTIVE_DEVICE_I2C; ibl.iblMagic = 0xCEC11EBC; ibl.pllConfig[ibl_MAIN_PLL].doEnable = TRUE; ibl.pllConfig[ibl_MAIN_PLL].prediv = 1; ibl.pllConfig[ibl_MAIN_PLL].mult = 20; ibl.pllConfig[ibl_MAIN_PLL].postdiv = 2; ibl.pllConfig[ibl_MAIN_PLL].pllOutFreqMhz = 1000; // ibl.pllConfig[ibl_DDR_PLL].doEnable = TRUE; // ibl.pllConfig[ibl_DDR_PLL].prediv = 3; // ibl.pllConfig[ibl_DDR_PLL].mult = 40; // ibl.pllConfig[ibl_DDR_PLL].postdiv = 2; // ibl.pllConfig[ibl_DDR_PLL].pllOutFreqMhz = 1333; /* Pll configuration is device specific */ devicePllConfig (); #define L1PEDCMD 0x01846408 #define L2EDCEN 0x01846030 #define L2EDCMD 0x01846008 #define SMEDCC 0x0BC00010 /* Enable L1P EDC */ *(volatile unsigned int *)(L1PEDCMD) = 0x1; //Set EN(bit0)=1 /* Enable EDC L2EDCEN, set DL2CEN(bit0),PL2CEN(bit1),DL2SEN(bit2),PL2SEN(bit3),SDMAEN(bit4)=1 */ *(volatile unsigned int *)(L2EDCEN) |= 0x1F; /* Enalble L2 EDC */ *(volatile unsigned int *)(L2EDCMD) = 0x1; /* Enalbe MSMC EDC */ *(volatile unsigned int *)(SMEDCC) &= 0x7FFFFFFF; //Clear SEN(bit31)=0 *(volatile unsigned int *)(SMEDCC) |= 0x40000000; //Set ECM(bit30)=1 /* undocumented register in data manual * Bit 0 of this register is supposed to give the status of PCIe PLL lock*/ #define PCIE_STS_REG 0x262015C /* Workaround for PCIe boot mode support for C6678/C6670 */ /* This is a temporary workaround should be removed once fixed in RBL */ /* PCIe Config register base on C6678/C6670 */ #define PCIE_BASE_ADDR 0x21800000 /* PCIe Application registers */ #define PCIE_APP_CMD_STATUS 0x4 #define PCIE_APP_OB_SIZE 0x30 #define PCIE_APP_MSI0_IRQ_ENABLE_SET 0x0108 #define PCIE_APP_LEGACY_A_IRQ_ENABLE_SET 0x0188 #define PCIE_APP_LEGACY_B_IRQ_ENABLE_SET 0x0198 #define PCIE_APP_LEGACY_C_IRQ_ENABLE_SET 0x01a8 #define PCIE_APP_LEGACY_D_IRQ_ENABLE_SET 0x01b8 #define OB_OFFSET_INDEX0 0x200 #define OB_OFFSET_HI0 0x204 #define OB_OFFSET_INDEX1 0x208 #define OB_OFFSET_HI1 0x20C #define PCIE_APP_IB_BAR0 0x300 #define PCIE_APP_IB_START0_LO 0x304 #define PCIE_APP_IB_START0_HI 0x308 #define PCIE_APP_IB_OFFSET0 0x30C #define PCIE_APP_IB_BAR1 0x310 #define PCIE_APP_IB_START1_LO 0x314 #define PCIE_APP_IB_START1_HI 0x318 #define PCIE_APP_IB_OFFSET1 0x31C #define PCIE_APP_IB_BAR2 0x320 #define PCIE_APP_IB_START2_LO 0x324 #define PCIE_APP_IB_START2_HI 0x328 #define PCIE_APP_IB_OFFSET2 0x32C #define PCIE_APP_IB_BAR3 0x330 #define PCIE_APP_IB_START3_LO 0x334 #define PCIE_APP_IB_START3_HI 0x338 #define PCIE_APP_IB_OFFSET3 0x33C #define PCIE_APP_SERDES_CFG0 0x390 #define PCIE_APP_SERDES_CFG1 0x394 /* PCIe Local Configuration registers */ #define PCIE_VENDER_DEVICE_ID 0x1000 #define PCIE_STATUS_CMD 0x1004 #define PCIE_CLASSCODE_REVID 0x1008 #define PCIE_BAR0 0x1010 #define PCIE_BAR1 0x1014 #define PCIE_BAR2 0x1018 #define PCIE_BAR3 0x101c #define PCIE_BAR4 0x1020 #define PCIE_BAR5 0x1024 #define PCIE_DEVICE_CAP 0x1074 #define PCIE_DEV_STAT_CTRL 0x1078 #define PCIE_LINK_STAT_CTRL 0x1080 #define PCIE_ACCR 0x1118 #define PCIE_PL_LINK_CTRL 0x1710 #define PCIE_DEBUG0 0x1728 #define PCIE_PL_GEN2 0x180C /* SERDES Configuration registers */ #define PCIE_SERDES_CFG_PLL 0x2620358 /* Power up PCIe */ devicePowerPeriph (TARGET_PWR_PCIE); for(i=0; i<1000; i++) asm (" NOP"); DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_SERDES_CFG0), 0x00062320); /* ss clock */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_SERDES_CFG1), 0x00022320); /* ss clock */ /* Wait for PCIe PLL lock */ while(!(DEVICE_REG32_R(PCIE_STS_REG) & 1)); DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_CLASSCODE_REVID), 0x04800001); /* class 0x04, sub-class 0x80, Prog I/F 0x00, Other multimedia device */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_LINK_STAT_CTRL), 0x10110080); /* extended sync, slot_clk_cfg = 1 */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_VENDER_DEVICE_ID), 0xb005104c); /* Vendor and Device ID */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_DEVICE_CAP), 0x288701); /* L0 = 4, L1 = 3 */ reg = DEVICE_REG32_R(PCIE_BASE_ADDR + PCIE_LINK_STAT_CTRL) & 0x0000FFFF; DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_LINK_STAT_CTRL), reg | 0x00010000); reg = DEVICE_REG32_R(PCIE_BASE_ADDR + PCIE_PL_LINK_CTRL) & 0x0000FFFF; DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_PL_LINK_CTRL), reg | 0x00010000); //DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_OB_SIZE ), 0x00000003); /* OB_SIZE = 8M */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_PL_GEN2 ), 0x0000020F); /* num_fts = 0xF*/ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_CMD_STATUS), 0x0020); /* Set dbi_cs2 to allow access to the BAR registers */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR0), 0x00000FFF); /* 4K */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR1), 0x00FFFFFF); /* 4K */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR2), 0x00000000); /* 4K */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR3), 0x00000000); /* 4K */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR4), 0x00000000); /* 4K */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR5), 0x00000000); /* 4K */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_CMD_STATUS), 0x0); /* dbi_cs2=0 */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_STATUS_CMD ), 0x00100146); /* ENABLE mem access */ //DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_DEV_STAT_CTRL), 0x0000281F); /* Error control */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_DEV_STAT_CTRL), 0x0000000F); /* Error control */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_ACCR ), 0x000001E0); /* Error control */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_IB_BAR0 ), 0x00000001); DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_IB_START0_LO), 0x70000000); DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_IB_START0_HI), 0x00000000); DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_IB_OFFSET0 ), 0x11800000); DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_CMD_STATUS), 0x0000004); //DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR0), 0x00000000); /* non-prefetch, 32-bit, mem bar */ DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR1), 0x70000000); DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_CMD_STATUS), 0x0000001); //DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_CMD_STATUS), 0x0000007); /* enable LTSSM, IN, OB */ while((DEVICE_REG32_R(PCIE_BASE_ADDR + PCIE_DEBUG0) & 0x11)!=0x11); /* Wait for training to complete */ /* Wait for the Boot from Host */ for(;;) { } }