首页 > 其他 > 详细

MTK动态加载,OTA实现。

时间:2014-03-17 20:44:25      阅读:1279      评论:0      收藏:0      [点我收藏+]

以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

MTK动态加载,OTA实现。,布布扣,bubuko.com

MTK动态加载,OTA实现。

原文:http://blog.csdn.net/wongshandev/article/details/21399719

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!