mtk rda 从bootload开始分析如何加载lcd驱动

#define  BOOT_SECTOR_NAND_SECTION_START  __attribute__((section (".boot_sector_nand_start")))

#define  BOOT_SECTOR_SECTION_START  __attribute__((section (".boot_sector_start")))

1.boot_sector_nand.c
           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         0
POWER_ON_ALARM          1
POWER_ON_CHARGER_IN     2
 POWER_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.4             
ProtocolEventHandler(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 access 
                g_lcddLock = 1;
            }
        }
    }
    else
    {
        LCDD_TRACE(LCDD_INFO_TRC, 0, "Lcdd load error"); 
    }
    //if not find lcdd ,must return LCDD_ERR_NO for produce
    g_lcddOpened = TRUE;
     return ret;
 }
做了两件重要的事情
15.1
 lcdd_LoadDrv
g_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;
}

....



















  

         


















你可能感兴趣的:(MTK,LCD,RDA,bootload)