天天看點

MTK動态加載,OTA實作。

以mtk6260D為例。實作在讀取T卡或者讀取手機U盤程式并運作之。平台代碼:

#if defined(__WS_OTA__)

#include "ws_main.h"

#define SF_WRITE_FS

void WriteLogFile(char* fmt,...);

void* DLL_malloc(S32 aSize);

void DLL_free(void* pData);

void WriteLogFileEx(kal_uint8* buf);

const U32 glb_dll_func_exports[] =

{

(U32)kal_prompt_trace,

(U32)DLL_malloc,

(U32)DLL_free,

(U32)StartTimer,

(U32)StartTimerEx,

(U32)StopTimer,

(U32)wmp_gsm_call_out,

(U32)memchr,

(U32)memcmp,

(U32)memcpy,

(U32)memmove,

(U32)memset,

(U32)strcat,

(U32)strchr,

(U32)strcmp,

(U32)strcoll,

(U32)strcpy,

(U32)strcspn,

(U32)strerror,

(U32)strlen,

(U32)strncat,

(U32)strncmp,

(U32)strncpy,

(U32)strpbrk,

(U32)strrchr,

(U32)strspn,

(U32)strstr,

(U32)strxfrm,

(U32)wcscat,

(U32)cosl,

(U32)erf,

(U32)exp,

(U32)fabs,

(U32)floor,

(U32)log,

(U32)modf,

(U32)nextafter,

(U32)pow,

(U32)remainder,

(U32)rint,

(U32)scalbln,

(U32)scalbn,

(U32)sin,

(U32)sqrt,

(U32)tan,

(U32)abort,

(U32)abs,

(U32)atof,

(U32)atoi,

(U32)atol,

(U32)atoll,

(U32)bsearch,

(U32)div,

(U32)labs,

(U32)ldiv,

(U32)mblen,

(U32)mbstowcs,

(U32)mbtowc,

(U32)qsort,

(U32)rand,

(U32)srand,

(U32)mmi_wcslen,

(U32)mmi_wcslwr,

(U32)mmi_wcsncat,

(U32)mmi_wcsncmp,

(U32)mmi_wcsncpy,

(U32)mmi_wcsnicmp,

(U32)mmi_wcsrchr,

(U32)mmi_wcsstr,

(U32)mmi_wcsupr,

(U32)mmi_wcs_itow,

(U32)mmi_wcs_n_to_asc,

(U32)mmi_wcs_to_asc,

(U32)mmi_wcs_wtoi,

(U32)mmi_wc_to_ucs2,

(U32)FS_Abort,

(U32)FS_CheckFile,

(U32)FS_Close,

(U32)FS_Commit,

(U32)FS_CompactDir,

(U32)FS_Count,

(U32)FS_CreateDir,

(U32)FS_Delete,

(U32)FS_Extend,

(U32)FS_FindClose,

(U32)FS_FindFirst,

(U32)FS_FindFirstN,

(U32)FS_FindNext,

(U32)FS_FindNextN,

(U32)FS_GenVirtualFileName,

(U32)FS_GetAttributes,

(U32)FS_GetCurrentDir,

(U32)FS_GetCurrentDirByDrive,

(U32)FS_GetFileInfo,

(U32)FS_GetFileInfoEx,

(U32)FS_GetFilePosition,

(U32)FS_GetFileSize,

(U32)FS_GetFolderSize,

(U32)FS_ParseFH,

(U32)FS_PseudoMerge,

(U32)FS_Read,

(U32)FS_RemoveDir,

(U32)FS_Rename,

(U32)FS_Seek,

(U32)FS_SeekLargeFile,

(U32)FS_SetAttributes,

(U32)FS_SetCurrentDir,

(U32)FS_SetSeekHint,

(U32)FS_SetSeekHintEx,

(U32)FS_Truncate,

(U32)FS_Write,

(U32)FS_XDelete,

(U32)FS_XDeleteEx,

};

dll_struct g_dll;

static kal_uint8 TK_mem_pool[MEM_POOL_SIZE];

static KAL_ADM_ID TK_mem_id;

void* DLL_malloc(S32 aSize)

{

return kal_adm_alloc(TK_mem_id,aSize);

}

void DLL_free(void* pData)

{

    kal_adm_free(TK_mem_id,pData);

}

S8 DLL_memory_init(void)

{

TK_mem_id = kal_adm_create(TK_mem_pool,MEM_POOL_SIZE,NULL,KAL_FALSE);

if(TK_mem_id)

return 1;

return 0;

}

void DLL_release(dll_struct* dll)

{

if(!dll)

return;

if(dll->mem_block)

{

DLL_free(dll->mem_block);

dll->mem_block = NULL;

}

memset(dll, 0, sizeof(dll_struct));

}

dll_struct* DLL_create(U16 *filename)

{

dll_struct* ret;

S32 app_file_handle;

S32 size;

S32 app_code_size;

dll_struct* dll_mem;

S32 readlen =0;

app_file_handle = FS_Open(filename, FS_READ_ONLY);

if (0 >= app_file_handle)

{

return NULL;

}

kal_prompt_trace(MOD_ENG,"%s",__func__,__LINE__);

ret = &g_dll;

memset(ret, 0, sizeof(dll_struct));

size = FS_Read(app_file_handle, (S8*)ret, sizeof(dll_header_struct), &readlen);

if (sizeof(dll_header_struct) > readlen)

{

DLL_release(ret);

return NULL;

}

app_code_size = ret->header.APP_RO_Size + ret->header.APP_RW_Size + ret->header.APP_ZI_Size;

//allocate more reserved 0x10 bytes to allign the address to 8

app_code_size += 0x10;

ret->mem_block = DLL_malloc(app_code_size);

if (NULL == ret->mem_block)

{

DLL_release(ret);

return NULL;

}

ret->app_code_base_addr = ((S32) ret->mem_block + 7) & 0xFFFFFFF8;

FS_Seek(app_file_handle, 0, FS_FILE_BEGIN);

app_code_size = ret->header.APP_RO_Size + ret->header.APP_RW_Size;

size = FS_Read(app_file_handle, (S8*)ret->app_code_base_addr, app_code_size, &readlen);

if (readlen != app_code_size)

{

DLL_release(ret);

return NULL;

}

FS_Close(app_file_handle);

dll_mem = (dll_struct*)ret->app_code_base_addr;

ret->app_data_base_addr = ret->app_code_base_addr + ret->header.APP_RO_Size;

dll_mem->header.feature = ret->app_data_base_addr;

ret->app_main_entry_addr = (S32)((S8*)(&dll_mem->header.App_Main_Entry_Offset) + ret->header.App_Main_Entry_Offset);

ret->app_zi_base_addr = ret->app_data_base_addr + ret->header.APP_RW_Size;

ret->header.APP_func_entry = (dll_func_entry*)&dll_mem->header.APP_func_entry;

{

S32 index;

dll_func_entry* func_entry_ptr;

size = sizeof(glb_dll_func_exports) / sizeof(U32);

func_entry_ptr = ret->header.APP_func_entry;

for (index = 0; index < size; index++)

{

if (func_entry_ptr->Func_Info.Func_Index!=index)

{

DLL_release(ret);

return NULL;

}

func_entry_ptr->Func_Info.Func_RunTime_Addr= glb_dll_func_exports[func_entry_ptr->Func_Info.Func_Index];

func_entry_ptr++;

}

}

//Initialize ZI region

memset((void*) ret->app_zi_base_addr, 0, ret->header.APP_ZI_Size);

kal_prompt_trace(MOD_ENG,"%s",__func__,__LINE__);

(*((DLL_main_func) ret->app_main_entry_addr))(ret);

return ret;

}

dll_struct* DLL_load(U16 *filename)

{

if(FS_GetAttributes(filename) == FS_FILE_NOT_FOUND)

{

return NULL;

}

WriteLogFile("DLL_load");

return DLL_create(filename);

}

void DLL_start(void)

{

dll_struct  *dll_instance=NULL;

int tem=0;

dll_instance= DLL_load(DLL_NAME);

if(!dll_instance)

{

return;

}

WriteLogFile("DLL_start");

(*((PsFuncPtr)dll_instance->export_funcs[1]))(&tem);

}

void DLL_main(void)

{

kal_prompt_trace(MOD_ENG,"%s",__func__,__LINE__);

if(DLL_memory_init())

DLL_start();

else

StartTimer(VS_FW_CUI_MENU_TIMER_1, 500, DLL_main);

}

#endif

繼續閱讀