#define
BOOT_SECTOR_NAND_SECTION_START __attribute__((section (".boot_sector_nand_start")))
#define
BOOT_SECTOR_SECTION_START __attribute__((section (".boot_sector_start")))
PROTECTED VOID BOOT_SECTOR_NAND_SECTION_START boot_Sector_Nand(UINT32 param)
2.boot_sector.c
PROTECTED VOID BOOT_SECTOR_SECTION_START boot_Sector(UINT32 param)
2 .1
/// Initialize flash memory and RAM memory.
// Copy booting code & data from ROM space to internal SRAM.
boot_MemInit : Initialize flash memory and RAM memory.
3. boot_loader.c
////
Real implementation of the boot loader, loading code after the stack has
been reseted in #boot_LoaderEnter();
PROTECTED VOID boot_Loader(UINT32 param)
bootloader 做了几件重要的事情
3.1 把ROM里面的数据copy到内部sram里面
3.2加载驱动 hal_Open(tgt_GetHalConfig());
tgt_GetHalConfig PROTECTED CONST HAL_CFG_CONFIG_T g_tgtHalCfg =
TGT_HAL_CONFIG;
tgt_board_cfg.h//加载各部分驱动配置
#define TGT_HAL_CONFIG \
{ \.chipVersion = TGT_HAL_CHIP_VERSION, \.rfClkFreq = TGT_HAL_RF_CLK_FREQ, \.useLpsCo1 = FALSE, \.keyInMask = 0x1f, \.keyOutMask = 0x1f, \.pwmCfg = TGT_HAL_PWM_CFG, \.useUsbBackup = FALSE, \.useClk32k = FALSE, \.i2cCfg = TGT_HAL_I2C_CFG, \.i2c1UseCamPins = FALSE, \.i2sCfg = TGT_HAL_I2S_CFG, \.ebcCfg = TGT_HAL_EBC_CFG, \.uartCfg = TGT_HAL_UART_CFG, \.spiCfg = TGT_HAL_SPI_CFG, \.useSdmmc = TRUE, \.useSdmmc2 = FALSE, \.spi2UseCamPins = FALSE, \.camCfg = TGT_HAL_CAM_CFG, \.goudaCfg = TGT_HAL_GOUDA_CFG, \.noConnectGpio = TGT_HAL_NO_CONNECT_GPIO, \.usedGpio = TGT_HAL_USED_GPIO, \.usedGpo = TGT_HAL_USED_GPO, \.usedTco = TGT_HAL_USED_TCO, \.ioDrive = TGT_HAL_IO_DRIVE \}
3.3 进入main函数
4. sap_main.c
int main (int argc, char *argv[])
main做了几件重要的事情
4.1 分配heap 堆
4.2 开启进程 sxs_StartAll ();
4.3 检测任务和任务调度
sxr_CheckTask
// Never return
sxr_StartScheduling ();
5. sap_main.c
void sxs_StartAll (void)
5.1对各种进程初始化
5.2 新建任务 sxr_NewTask
5.3 开启任务 sxr_StartTask
u8 TaskId =
sxs_usrInitTaskId [i] = sxr_NewTask (&sxs_UsrInitTaskCfg [i].TaskDesc);
sxr_StartTask (TaskId, (void *)
sxs_UsrInitTaskCfg [i].UsrInitTask);
const sxs_UsrInitTaskCfg_t sxs_UsrInitTaskCfg [] =
{#ifdef __DISPLAY_POWERON_LOGO__{{(void(*)(void *))sxs_UsrInitTask,0,"USR INIT: Power-on LOGO",USR_INIT_POWER_ON_LOGO_TASK_STACK_SIZE,USR_INIT_POWER_ON_LOGO_TASK_PRIORITY},(void(*)(void))&lcd_present_CS_log},#endif //__DISPLAY_POWERON_LOGO__{{(void(*)(void *))sxs_UsrInitTask,0,"USR_INIT: BAL Init Task",USR_INIT_BAL_INIT_TASK_STACK_SIZE,USR_INIT_BAL_INIT_TASK_PRIORITY},(void(*)(void))& BAL_TaskInit},{{(void(*)(void *))sxs_UsrInitTask,0,"USR_INIT: Decompress Task",USR_INIT_DECOMPRESS_TASK_STACK_SIZE,USR_INIT_DECOMPRESS_TASK_PRIORITY},(void(*)(void))&BAL_DecompressCode},};
6. bal_init.c
BOOL BAL_TaskInit()
taskinit做了几件重要的事情
6.1 csw_MemIint(); //初始化内存分配 tgt_app
VDS_Init
DSM_DevInit // describes the DSM(Data Storage Mangage) configuration
REG_Init
CFW_CfgInit
SMS_DM_Init
FS_PowerOn
FS_GetDeviceInfo // // Get FS device table.
// Check the state of root device ,if not format, format it.
// Mount root device.
//文件系统建立好之后 开始开启任务 // Start application tasks
for(i = 0; i< MAX_BAL_TASK_NUM; i++)
g_BalTasks[i] = HNULL;
g_BalTasks[BAL_TASK_NUM(BAL_SYS_TASK_PRIORITY)] = COS_CreateTask_Prv(BAL_SysTask, NULL, NULL,
BAL_SYS_TASK_STACK_SIZE, BAL_SYS_TASK_PRIORITY, COS_CREATE_DEFAULT, 0, "BAL_SysTask");
#ifdef CFW_TCPIP_SUPPORT
g_BalTasks[BAL_TASK_NUM(BAL_CFW_ADV_TASK_PRIORITY)] = COS_CreateTask_Prv(BAL_CFWApsTask, NULL, NULL,
BAL_CFW_ADV_TASK_STACK_SIZE, BAL_CFW_ADV_TASK_PRIORITY, COS_CREATE_DEFAULT, 0, "BAL_CFWApsTask");
#endif
g_BalTasks[BAL_TASK_NUM(BAL_DEV_MONITOR_TASK_PRIORITY)] = COS_CreateTask_Prv(BAL_DevMonitorTask, NULL, NULL,
BAL_DEV_MONITOR_TASK_STACK_SIZE, BAL_DEV_MONITOR_TASK_PRIORITY, COS_CREATE_DEFAULT, 0, "BAL_DevMonitorTask");
g_BalTasks[3] = COS_CreateTask_Prv(BAL_BackgroundTask, NULL, NULL,
BAL_BG_TASK_STACK_SIZE, COS_BK_TASK_PRI, COS_CREATE_DEFAULT, 0, "BAL_BackgroundTask");
BAL_ApplicationInit();
#ifdef WIFI_SUPPORT
wifi_task_init();
#endif
7. TaskInit.c //应用层任务建立初始化
BOOL BAL_ApplicationInit ( VOID )
1.
//
Require mmi clk
csw_SetResourceActivity(CSW_LP_RESOURCE_MMIACTIVE, CSW_SYS_FREQ_104M);
7.2 COS_CreateTask //创建任务
7.3 COS_StartTask //开启任务
eg:
hTask = COS_CreateTask(BAL_MmiMainTaskEntry,NULL, NULL,MMI_TASK_STACK_SIZE,MMI_TASK_PRIORITY,COS_CREATE_SUSPENDED, 0, "MMI Main Task");ASSERT(hTask != HNULL);SetMmiTaskHandle(MOD_MMI, hTask);
COS_StartTask((TASK_HANDLE*)GetMmiTaskHandle(MOD_MMI), NULL);
8. MMITask.c
void BAL_MmiMainTaskEntry(void *pData)
BAL_MmiMainTaskEntry做了四件事情
8.1
StartTimer(TIMER_REAL_TIME_CLOCK, 1000, DateTimerProc);
//开启定时器
8.2
switch (ppower_on->poweron_mode) //
注册开机
POWER_ON_KEYPAD 0POWER_ON_ALARM 1POWER_ON_CHARGER_IN 2POWER_ON_EXCEPTION 3
InitializeResourceVariables();MMICheckDiskDisplay(); //display logo/*Guojian Add End For 10810 Ver: GreenStone on 2008-12-19 13:59 */
ResetAbnormalReset();InitializeAll();/*************************************** To initialize nvram data***************************************/InitNvramData();TurnOnBacklight(1);8.3 注册耳机gpio事件//8.4ProtocolEventHandler(Message->msg_id,(void*)Message->local_para_ptr,(int)Message->src_mod_id, (void*) Message); // 处理其他消息事件
9. MMITask.c
void MMICheckDiskDisplay(void)
/* init graphic library. including lcd and all drawing related modules */gdi_init();
10. gdi.c
gdi_init
11. gdi_lcd.c
gdi_lcd_init
lcd_init(MAIN_LCD, DRV_MAINLCD_INIT_COLOR);
12. lcd_if.c
void lcd_init(kal_uint8 lcd_id, kal_uint16 background_color)
//This function is used to initialize the LCD interface and LCD module
13. drv_lcd_chip.c
VOID Init_DI(UINT32 background, VOID** unused){mci_LcdInit(background);}
14. mci_lcd.c
VOID mci_LcdInit(UINT32 background)
{static VOLATILE BOOL visitFlag = 0;UINT32 status = hal_SysEnterCriticalSection();if (!visitFlag){visitFlag = 1;g_mciLcdBypassFunction=NULL;hal_SysExitCriticalSection(status);
MCI_TRACE(MCI_LCD_TRC_LVL,0,"mci_LcdInit");lcdd_Open();lcdd_GetScreenInfo(&g_mciLcdScreenInfo);mci_LcdClearScreen(background);}else{hal_SysExitCriticalSection(status);}}
15. lcdd.c
/// Open the LCDD driver./// It must be called before any call to any other function of this driver./// This function is to be called only once.
PUBLIC LCDD_ERR_T lcdd_Open(VOID){LCDD_ERR_T ret = LCDD_ERR_NO;
// Allow access to other LCD functions
if ( lcdd_LoadDrv()){if ( g_lcddDrv->lcdd_Open != NULL){lcdd_SetBrightness(0);ret = g_lcddDrv->lcdd_Open();if (ret == LCDD_ERR_NO){// Allow accessg_lcddLock = 1;}}}else{LCDD_TRACE(LCDD_INFO_TRC, 0, "Lcdd load error");}//if not find lcdd ,must return LCDD_ERR_NO for produceg_lcddOpened = TRUE;return ret;}做了两件重要的事情15.1lcdd_LoadDrvg_lcddDrv->lcdd_Open()
16.
以
ili9163c 为例:
drv_lcd_ili9163c.c
PUBLIC BOOL lcdd_ili9163c_RegInit(LCDD_REG_T *pLcdDrv)
{if( lcddp_CheckProductId()){pLcdDrv->lcdd_Open= lcddp_Open;pLcdDrv->lcdd_Close=lcddp_Close;pLcdDrv->lcdd_SetContrast=lcddp_SetContrast;pLcdDrv->lcdd_SetStandbyMode=lcddp_SetStandbyMode;pLcdDrv->lcdd_PartialOn=lcddp_PartialOn;pLcdDrv->lcdd_PartialOff=lcddp_PartialOff;pLcdDrv->lcdd_Blit16=lcddp_Blit16;pLcdDrv->lcdd_Busy=lcddp_Busy;pLcdDrv->lcdd_FillRect16=lcddp_FillRect16;pLcdDrv->lcdd_GetScreenInfo=lcddp_GetScreenInfo;pLcdDrv->lcdd_WakeUp=lcddp_WakeUp;pLcdDrv->lcdd_SetPixel16=lcddp_SetPixel16;pLcdDrv->lcdd_Sleep=lcddp_Sleep;pLcdDrv->lcdd_SetDirRotation=lcddp_SetDirRotation;pLcdDrv->lcdd_SetDirDefault=lcddp_SetDirDefault;pLcdDrv->lcdd_GetStringId=lcdd_get_id_string;
return TRUE;}
return FALSE;}
....