第6节 代码举例
下例代码设置MCF5445x MCU使用内部PCI仲裁器和所有PCI请求/允许引脚。该例也配置了PCI总线控制器以允许发起PCI事务和接收PCI事务。这里用寄存器的名称来作为宏定义,它的实际值在后面的注释中给出。其它配置也是可能的。
/*设置PCI仲裁器*/
MCF_PCIARB_PACR = 0 /* 0x001f001f */
| MCF_PCIARB_PACR_INTMPRI
| MCF_PCIARB_PACR_INTMINTEN
| MCF_PCIARB_PACR_EXTMPRI(0x1F)
| MCF_PCIARB_PACR_EXTMINTEN(0x1F);
/*设置所有PCI使用的PCI请求和允许引脚*/
MCF_GPIO_PAR_PCI = 0 /* 0xd5d5*/
| MCF_GPIO_PAR_PCI_GNT3_GNT3
| MCF_GPIO_PAR_PCI_GNT2_GNT2
| MCF_GPIO_PAR_PCI_GNT1_GNT1
| MCF_GPIO_PAR_PCI_GNT0_GNT0
| MCF_GPIO_PAR_PCI_REQ3_REQ3
| MCF_GPIO_PAR_PCI_REQ2_REQ2
| MCF_GPIO_PAR_PCI_REQ1_REQ1
| MCF_GPIO_PAR_PCI_REQ0_REQ0;
/*设置PCI接口转换速率(从66MHz到33MHz),这是引导时的初始化配置,但如果需要,在运行时也可以配置*/
MCF_GPIO_MSCR_PCI = MCF_GPIO_MSCR_PCI_PCI_HI_66MHZ;
/*设置发起窗口:基地址,大小和事务地址*/
/*窗口0将解码从0xa0000000开始的64MB并且转到PCI存储器地址空间的相同区域。这将作为PCI存储器窗口*/
| MCF_PCI_PCIIWBTAR_WBA(PCI_MEM_ADDRESS)
| MCF_PCI_PCIIWBTAR_WAM(PCI_MEM_SIZE)
| MCF_PCI_PCIIWBTAR_WTA(PCI_MEM_T_ADDRESS);
/*窗口1将解码从0xa4000000开始的16MB并且转到PCI IO地址空间的0xa4000000。这将作为PCI IO窗口*/
MCF_PCI_PCIIW1BTAR = 0 /* 0xa400a400 */
| MCF_PCI_PCIIWBTAR_WBA(PCI_IO_ADDRESS)
| MCF_PCI_PCIIWBTAR_WAM(PCI_IO_SIZE)
| MCF_PCI_PCIIWBTAR_WTA(PCI_IO_T_ADDRESS);
/*窗口2将解码从0xa5000000开始的16MB并且可以用作配置数据窗口。如果PCICAR的使能位置位,任何IO窗口也必须用作配置窗口。当作为配置窗口时,使用PCICAR内的地址而不是转换值。*/
MCF_PCI_PCIIW2BTAR = 0 /* 0xa500a500 */
| MCF_PCI_PCIIWBTAR_WBA(PCI_CFG_ADDRESS)
| MCF_PCI_PCIIWBTAR_WAM(PCI_CFG_SIZE)
| MCF_PCI_PCIIWBTAR_WTA(PCI_CFG_T_ADDRESS);
MCF_PCI_PCIIWCR = 0 /* 0x01090900 */
| MCF_PCI_PCIIWCR_WINCTRL0_MEMREAD
| MCF_PCI_PCIIWCR_WINCTRL1_IO
| MCF_PCI_PCIIWCR_WINCTRL2_IO;
/*允许发起者访问和目标存储器访问*/
MCF_PCI_PCISCR |= 0 /* 0x00000006 */
| MCF_PCI_PCISCR_B
| MCF_PCI_PCISCR_M;
/*设置最大重试写为0,以无限重试并且禁止块中的中断*/
MCF_PCI_PCIICR = MCF_PCI_PCIICR_MAXRETRY(0);/* 0x00000000 */
/*设置发起者事务的等待时间和缓存现大小*/
MCF_PCI_PCICR1 = 0 /* 0x0000f804 */
| MCF_PCI_PCICR1_LATTIMER(255)
| MCF_PCI_PCICR1_CACHELINESIZE(4);
/*设置目标寄存器。通常只需要一个BAR寄存器并且它指向DRAM。然而BAR0用于特殊目的,比如指向内部寄存器空间或SRAM*/
MCF_PCI_PCIBAR0 = PCI_TARG0_BAR0; /* 0xfc000000 */
MCF_PCI_PCIBAR5 = PCI_TARG0_BAR1; /* 0x00000001 */
MCF_PCI_PCITBATR0 = IPSBAR_ADDRESS | 1; /* 0xfc000001 */
MCF_PCI_PCITBATR5 = SDRAM_ADDRESS | 1; /* 0x40000001 */
MCF_PCI_PCITCR2 = 0 /* 0x00002100 */
| MCF_PCI_PCITCR2_B0E
| MCF_PCI_PCITCR2_B5E; /*使能目标性能特色例如预期和联合写*/
MCF_PCI_PCITCR = 0 /* 0x00010008 */
| MCF_PCI_PCITCR_P
| MCF_PCI_PCITCR_WCT(8);
/*PCI复位位无效*/
MCF_PCI_PCIGSCR = 0;
/*在这里插入等待允许PCI设备离开复位*/
/*设置PCI仲裁器*/
MCF_PCIARB_PACR = 0 /* 0x001f001f */
| MCF_PCIARB_PACR_INTMPRI
| MCF_PCIARB_PACR_INTMINTEN
| MCF_PCIARB_PACR_EXTMPRI(0x1F)
| MCF_PCIARB_PACR_EXTMINTEN(0x1F);
/*设置所有PCI使用的PCI请求和允许引脚*/
MCF_GPIO_PAR_PCI = 0 /* 0xd5d5*/
| MCF_GPIO_PAR_PCI_GNT3_GNT3
| MCF_GPIO_PAR_PCI_GNT2_GNT2
| MCF_GPIO_PAR_PCI_GNT1_GNT1
| MCF_GPIO_PAR_PCI_GNT0_GNT0
| MCF_GPIO_PAR_PCI_REQ3_REQ3
| MCF_GPIO_PAR_PCI_REQ2_REQ2
| MCF_GPIO_PAR_PCI_REQ1_REQ1
| MCF_GPIO_PAR_PCI_REQ0_REQ0;
/*设置PCI接口转换速率(从66MHz到33MHz),这是引导时的初始化配置,但如果需要,在运行时也可以配置*/
MCF_GPIO_MSCR_PCI = MCF_GPIO_MSCR_PCI_PCI_HI_66MHZ;
/*设置发起窗口:基地址,大小和事务地址*/
/*窗口0将解码从0xa0000000开始的64MB并且转到PCI存储器地址空间的相同区域。这将作为PCI存储器窗口*/
| MCF_PCI_PCIIWBTAR_WBA(PCI_MEM_ADDRESS)
| MCF_PCI_PCIIWBTAR_WAM(PCI_MEM_SIZE)
| MCF_PCI_PCIIWBTAR_WTA(PCI_MEM_T_ADDRESS);
/*窗口1将解码从0xa4000000开始的16MB并且转到PCI IO地址空间的0xa4000000。这将作为PCI IO窗口*/
MCF_PCI_PCIIW1BTAR = 0 /* 0xa400a400 */
| MCF_PCI_PCIIWBTAR_WBA(PCI_IO_ADDRESS)
| MCF_PCI_PCIIWBTAR_WAM(PCI_IO_SIZE)
| MCF_PCI_PCIIWBTAR_WTA(PCI_IO_T_ADDRESS);
/*窗口2将解码从0xa5000000开始的16MB并且可以用作配置数据窗口。如果PCICAR的使能位置位,任何IO窗口也必须用作配置窗口。当作为配置窗口时,使用PCICAR内的地址而不是转换值。*/
MCF_PCI_PCIIW2BTAR = 0 /* 0xa500a500 */
| MCF_PCI_PCIIWBTAR_WBA(PCI_CFG_ADDRESS)
| MCF_PCI_PCIIWBTAR_WAM(PCI_CFG_SIZE)
| MCF_PCI_PCIIWBTAR_WTA(PCI_CFG_T_ADDRESS);
MCF_PCI_PCIIWCR = 0 /* 0x01090900 */
| MCF_PCI_PCIIWCR_WINCTRL0_MEMREAD
| MCF_PCI_PCIIWCR_WINCTRL1_IO
| MCF_PCI_PCIIWCR_WINCTRL2_IO;
/*允许发起者访问和目标存储器访问*/
MCF_PCI_PCISCR |= 0 /* 0x00000006 */
| MCF_PCI_PCISCR_B
| MCF_PCI_PCISCR_M;
/*设置最大重试写为0,以无限重试并且禁止块中的中断*/
MCF_PCI_PCIICR = MCF_PCI_PCIICR_MAXRETRY(0);/* 0x00000000 */
/*设置发起者事务的等待时间和缓存现大小*/
MCF_PCI_PCICR1 = 0 /* 0x0000f804 */
| MCF_PCI_PCICR1_LATTIMER(255)
| MCF_PCI_PCICR1_CACHELINESIZE(4);
/*设置目标寄存器。通常只需要一个BAR寄存器并且它指向DRAM。然而BAR0用于特殊目的,比如指向内部寄存器空间或SRAM*/
MCF_PCI_PCIBAR0 = PCI_TARG0_BAR0; /* 0xfc000000 */
MCF_PCI_PCIBAR5 = PCI_TARG0_BAR1; /* 0x00000001 */
MCF_PCI_PCITBATR0 = IPSBAR_ADDRESS | 1; /* 0xfc000001 */
MCF_PCI_PCITBATR5 = SDRAM_ADDRESS | 1; /* 0x40000001 */
MCF_PCI_PCITCR2 = 0 /* 0x00002100 */
| MCF_PCI_PCITCR2_B0E
| MCF_PCI_PCITCR2_B5E; /*使能目标性能特色例如预期和联合写*/
MCF_PCI_PCITCR = 0 /* 0x00010008 */
| MCF_PCI_PCITCR_P
| MCF_PCI_PCITCR_WCT(8);
/*PCI复位位无效*/
MCF_PCI_PCIGSCR = 0;
/*在这里插入等待允许PCI设备离开复位*/


