关于MSTAR的IO初始化
volatile U8 code padInitTbl[]= //attribute((section (".isp_info"))) =
drvPadConf.c中这个初始化表,是用来实现对IO PORT的功能实现初始化的。跟了一下这个结构。表非常长,相当于把每一个IO定义了一遍,形成了一个数据表,这个表在
void MDrv_Pad_Init( void )中实调用,
void MDrv_Pad_Init( void )
{
U8 code *pPadConfig;
U8 u8Length;
U16 u16Index; // register index
u32MapBase = _MapBase_nonPM_MAYA;
pPadConfig = (U8 *)padInitTbl + 10;
while (1)
{
u16Index = (pPadConfig[0] << 8) + (pPadConfig[1]);
if (u16Index == 0xFFFF) // check end of table
break;
pPadConfig += 2;
if(u16Index == 0x0000) // switch base address
{
if((pPadConfig[0]==0x10)||(pPadConfig[0]==0x11))
{
u32MapBase = _MapBase_nonPM_MAYA;
}
else if(pPadConfig[0]==0x00)
{
u32MapBase = _MapBase_PM_MAYA;
}
pPadConfig += 2;
continue;
}
u8Length = HIGHBYTE(u16Index) >> 6;
u16Index &= 0x3FFF;
while (1)
{
//printf("%x = %bx & %bx\n", u16Index, pPadConfig[0], pPadConfig[1]);
MDrv_PAD_WriteByteMask((U32)u16Index, pPadConfig[0], pPadConfig[1]);
pPadConfig += 2;
if (u8Length == 0)
break;
u8Length--;
u16Index++;
}
}
}
而MDrv_Pad_Init()函数是在SYSINIT.C文件中被调用。
void start(void)
{
U32 u32MiuProtectAlign;
U32 u32Start;
U32 u32End;
U32 u32MiuProtectAddr_Start, u32MiuProtectAddr_End;
// Added by coverity_0210
U32 u32Tmp;
extern U8 _readonly_start[];
extern U8 _readonly_end[];
//extern void uart_init(U32 aeon_clock, U32 uart_clock); //T3 FPGA test
extern int main(void);
extern void MDrv_Pad_Init(void);
extern void MDrv_ISR_Init(void);
extern void mhal_stack_init(void *stack);
char *stack;
// Setup stack
stack = (char *)malloc(STACK_SIZE);
if (stack)
{
stack += STACK_SIZE;
mhal_stack_init(stack);
}
else
{
ASSERT(0);
}
#if (!BLOADER)
MDrv_WDT_Init(E_WDT_DBGLV_NONE);
#endif
MDrv_MMIO_GetBASE((MS_U32 *) &RIU_MAP, &u32Tmp, MS_MODULE_PM);
#if (PM_LOCK_SUPPORT == 1)
MDrv_SEM_Init();
#endif
MDrv_MIU_SetIOMapBase();
#if 0//(MEMORY_MAP <= MMAP_32MB)
{
// Set all invalid after 32M
u32Start = 0x2000000; // 32M
u32End = 0x4000000; // 64M
MDrv_MIU_Protect(3, zero_array, ALIGN(u32Start + ((1<<pageshift) - 1), pageshift), ALIGN(u32End, pageshift), ENABLE);
}
#endif
Util_InitSymbolTBL();
console_init();
***MDrv_Pad_Init();***
mdrv_gpio_init();