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;
// 等待MTOCIPC标志寄存器的相关位清零
while (HWREG(MTOCIPC_BASE + IPC_O_MTOCIPC标志寄存器) & (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;
}
IPCLiteMtoCSetBits_Protected 程序说明
IPCLiteMtoCSetBits_Protected (unsigned long ulFlag, unsigned long ulAddress,
unsigned long ulMask, unsigned short usLength,
unsigned long ulStatusFlag)
{
//如果MTOCIPC标志寄存器中的相关FLAG已经为1,说明在使用返回fail
if (HWREG(MTOCIPC_BASE + IPC_O_MTOCIPC标志寄存器) & (ulFlag | ulStatusFlag))
{
return STATUS_FAIL;
}
//如果设定使用16位长度的命令,相关命令参考Table 6-17. MTOC IPC Commands
if (usLength == IPC_LENGTH_16_BITS)
{
// Set up 16-bit set bits command, address, and mask.
HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCCOM) = IPC_SET_BITS_16_PROTECTED;//写入商议好的命令
HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCADDR) = ulAddress; //要操作的寄存器地址,或者要跳转的地址
HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCDATAW) = ulMask & (0x0000FFFF); //对应寄存器要写入的值
}//如果设定使用32位长度的命令,相关命令参考Table 6-17. MTOC IPC Commands
else if (usLength == IPC_LENGTH_32_BITS)
{
// Set up 32-bit set bits command, address, and mask.
HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCCOM) = IPC_SET_BITS_32_PROTECTED;//写0x0a
HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCADDR) = ulAddress; //要操作的寄存器地址,或者要跳转的地址
HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCDATAW) = ulMask; //对应寄存器要写入的值
}
// 置位相关IPC标志位,引起28X一侧的中断
HWREG(MTOCIPC_BASE + IPC_O_MTOCIPCSET) |= (ulFlag | ulStatusFlag);
return STATUS_PASS;
}
对比看看 是否配置合理
|