IPCMtoCBootControlSystem程序说明
unsigned short IPCMtoCBootControlSystem(unsigned long ulBootMode) { //读取CTOMIPCBOOTSTS寄存器,该寄存器C28X的地址在0x4E20,M3的地址在0x400FB740 //读到的数是0x00010002,Figure 6-15. C-Boot ROM Health Status; // Table 6-19. C-Boot ROM Boot Status Values //说明28X的boot已经开始,还在进程中 while ((HWREG(MTOCIPC_BASE + IPC_O_CTOMIPCBOOTSTS) & CBROM_BOOTSTS_CTOM_CONTROL_SYSTEM_READY)!= CBROM_BOOTSTS_CTOM_CONTROL_SYSTEM_READY) { }
//初始化28X侧的RAM,Msg和L0~L3 if(RAMControlInitM1MsgRam()) return true; if(RAMControlInitL0L3Ram()) return true;
// 等待MTOCIPCFLG的相关位清零 while (HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCFLG) & (IPC_FLAG1 | IPC_FLAG32)) { } //看看用户设置的ulBootMode值是否合法 if (ulBootMode >= CBROM_MTOC_BOOTMODE_BOOT_COMMAND_MAX_SUPPORT_VALUE)//CBROM_MTOC_BOOTMODE_BOOT_COMMAND_MAX_SUPPORT_VALUE=0x7 { return STATUS_FAIL; }
// 按照设置的BOOTMode设置相关的引脚 switch (ulBootMode) { case CBROM_MTOC_BOOTMODE_BOOT_FROM_SCI: // SCITXDA -> PF3_GPIO35 设置SCI相关引脚,把GPIO功能给到S8X内核控制 // SCIRXDA -> PF4_GPIO36 HWREG(GPIO_PORTF_BASE + GPIO_O_PUR) |= (GPIO_PIN_3 | GPIO_PIN_4); HWREG(GPIO_PORTF_BASE + GPIO_O_CSEL) |= (GPIO_PIN_3 | GPIO_PIN_4); break; case CBROM_MTOC_BOOTMODE_BOOT_FROM_SPI: // SPISIMOA -> PD0_GPIO16 设置SPI相关引脚,把GPIO功能给到S8X内核控制 // SPISOMIA -> PD1_GPIO17 // SPICLKA -> PD2_GPIO18 // SPISTEA -> PD3_GPIO19 HWREG(GPIO_PORTD_BASE + GPIO_O_PUR) |= (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3); HWREG(GPIO_PORTD_BASE + GPIO_O_CSEL) |= (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3); break; case CBROM_MTOC_BOOTMODE_BOOT_FROM_I2C: // SDAA -> PF0_GPIO32 设置I2C相关引脚,把GPIO功能给到S8X内核控制 // SCLA -> PF1_GPIO33 HWREG(GPIO_PORTF_BASE + GPIO_O_PUR) |= (GPIO_PIN_0 | GPIO_PIN_1); HWREG(GPIO_PORTF_BASE + GPIO_O_CSEL) |= (GPIO_PIN_0 | GPIO_PIN_1); break; case CBROM_MTOC_BOOTMODE_BOOT_FROM_PARALLEL: SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); //设置并口相关引脚,把GPIO功能给到S8X内核控制 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
// GPIO[7:6] -> PB1:0_GPIO1:0 // GPIO[5:0] -> PA5:0_GPIO5:0 HWREG(GPIO_PORTA_BASE + GPIO_O_PUR) |= (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5); HWREG(GPIO_PORTB_BASE + GPIO_O_PUR) |= (GPIO_PIN_0 | GPIO_PIN_1); HWREG(GPIO_PORTA_BASE + GPIO_O_CSEL) |= (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5); HWREG(GPIO_PORTB_BASE + GPIO_O_CSEL) |= (GPIO_PIN_0 | GPIO_PIN_1); // DSP_CTL -> PE2_GPIO26 // HOST_CTL -> PE3_GPIO27 HWREG(GPIO_PORTE_BASE + GPIO_O_PUR) |= (GPIO_PIN_2 | GPIO_PIN_3); HWREG(GPIO_PORTE_BASE + GPIO_O_CSEL) |= (GPIO_PIN_2 | GPIO_PIN_3); break; } //最后,写入MTOCIPCCOM命令, HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCCOM) = IPC_MTOC_EXECUTE_BOOTMODE_CMD;//0x00000013=19 HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCBOOTMODE) = ulBootMode;
//置位FLAG1和FLAG32 HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCSET) |= (IPC_FLAG1 | IPC_FLAG32);
return STATUS_PASS; } |