MTK中的nvram的操作實現_第1頁
MTK中的nvram的操作實現_第2頁
MTK中的nvram的操作實現_第3頁
MTK中的nvram的操作實現_第4頁
MTK中的nvram的操作實現_第5頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

NVRAM讀寫操作詳解在MTK中,NVRAM是作為一個獨立的task來運行的。在nvram_main.c文件中,(代碼有刪減,注釋部分用黃色標出,便于閱讀)voidnvram_task_main(task_entry_struct*task_entry_ptr){kal_get_my_task_index(&my_index);/*nvramspecialservice*/nvram_special_service();while(1){//從Q中得到消息receive_msg_ext_q(task_info_g[task_entry_ptr->task_indx].task_ext_qid,¤t_ilm);stack_set_active_module_id(my_index,current_ilm.dest_mod_id); //處理消息nvram_main(¤t_ilm); //釋放消息free_ilm(¤t_ilm);}}Nvram_main函數,處理NVRAM相關的消息voidnvram_main(ilm_struct*ilm_ptr){if(ilm_ptr!=NULL){if((ilm_ptr->msg_id>=MSG_ID_NVRAM_CODE_BEGIN)&&(ilm_ptr->msg_id<=MSG_ID_NVRAM_CODE_END)){if(ilm_ptr->msg_id==MSG_ID_NVRAM_STARTUP_REQ){ //STARTUP消息nvram_startup_handler(ilm_ptr);}elseif(ilm_ptr->msg_id==MSG_ID_NVRAM_RESET_REQ){ //RESET消息nvram_reset_handler(ilm_ptr);}elseif(ilm_ptr->msg_id==MSG_ID_NVRAM_READ_REQ){ nvram_read_handler(ilm_ptr); //READ消息}elseif(ilm_ptr->msg_id==MSG_ID_NVRAM_WRITE_REQ){nvram_write_handler(ilm_ptr);//WRITE消息}elseif(ilm_ptr->msg_id==MSG_ID_NVRAM_SET_LOCK_REQ){nvram_set_lock_handler(ilm_ptr);//LOCK消息,比較多用在TST中}}}/*endofmodulemainfunction*/也可以看到NVRAMtask處理幾個消息.READ流程從NV中讀取一個數據,例如讀取語言設置信息:ReadValue(NVRAM_SETTING_LANG,&data,DS_BYTE,&error);我們需要注明,NVRAM的LID,讀取數據存放的指針,數據類型,和返回錯誤信息的地址.#defineReadValue(nId,pBuffer,nDataType,pError)\ReadValueInt(nId,pBuffer,nDataType,pError,__FILE__,__LINE__)ReadValue精簡了兩個參數,不需要注明文件和第多少行,方面了應用使用.看一下ReadValueInt這個函數.我們來看看這個函數到底干了什么事情:S32ReadValueInt(U8nDataItemId,void*pBuffer,U8nDataType,S16*pError,S8*fileName,S32lineNumber){switch(nDataType){caseDS_BYTE:{ //byteDataReadFlag先記住這個標志,它標志了byte的數據是否已經被讀取,所以從這里我們可以猜測,NVRAM的數據,應該不是每次都從硬件讀取的,而是有緩存的(記住這個假設,稍后驗證)/*secondtimereading,italwasyreturnonerequestitem*/if(byteDataReadFlag){ //這個注釋就更加明白了/*DataiscachednoneedtoreadfromNVRAM*/memcpy(pBuffer,&byte_data[nDataItemId*nDataType],nDataType);status=DS_BYTE;error=NVRAM_READ_SUCCESS;}/*processfirsttimereadingalldataandreturnfirstrequestitemdata*/else{/*ReaddatafromtheNVRAMfile*/ //這才從NVRAM文件中讀取 //這個BUFFER的大小,8*512=4KU8tempBuffer[NVRAM_CACHE_SIZE]; //這個函數重點分析status=ReadRecordInt(NVRAM_EF_CACHE_BYTE_LID,1,tempBuffer,sizeof(tempBuffer),&error,fileName,lineNumber);/*copyoutalltotalreadingdata*/ //把讀取的數據copy到byte_data里面去memcpy(byte_data,tempBuffer,sizeof(tempBuffer)); //這個時候把這個flag置上了byteDataReadFlag=1;/*returnfirstrequestitemdata*/memcpy(pBuffer,&byte_data[nDataItemId*nDataType],nDataType);status=DS_BYTE;error=NVRAM_READ_SUCCESS;}break;}/*EndofcaseDS_BYTE*///后面的SHORT,DOUBLE同樣道理caseDS_SHORT:{}/*EndofcaseDS_SHORT*/caseDS_DOUBLE:{}/*EndofcaseDS_DOUBLE*/}*pError=error;returnstatus;}ReadValueInt總結:這個函數,就是把以前讀好的三個數組的數據拿出來,如果還沒有從NVRAM讀取到cashe里面,就讀一次.關鍵的函數是:ReadRecordInt.第一次讀BYTE類型的數據之前,三個數組都是空的,flag也是空的,讀一個之后,byte數據被從NVRAM文件中讀入到cashe中,放在byte的數組里面,byteflag也被置上了.下次再讀的byte,就只需要從CACHE中讀取就可以了.同理,short和double數據也相同.來看看它是怎么做的#defineReadRecordInt(nFileId,nRecordId,pBuffer,nBufferSize,pError,fileName,lineNumber)\AccessRecordInt(nFileId,nRecordId,pBuffer,nBufferSize,1,pError,MMI_FALSE,MMI_TRUE,fileName,lineNumber)S32AccessRecordInt(U16nFileId,U16nRecordId,void*pBuffer,U16nBufferSize,U16nRecordAmount,S16*pError,pBOOLisWrite,pBOOLisValue,S8*filename,S32lineNumber){MYQUEUEqueueNode;S32status=-1;U32my_index;circularQ_check_enumcircularQ_check_result=circularQ_check_never_check;staticU8nvram_req_count=0;MMI_BOOLtoPush;if(isWrite){//WRITE的先放一下,先看READ的再說}else{ //發了一個消息 SendNVRAMReadReq(nFileId,nRecordId,nRecordAmount);//這個函數調用了Message.oslMsgId=MSG_ID_MMI_EQ_NVRAM_READ_REQ;//OslMsgSendExtQueue(&Message),發了一個REQ消息到Q上去.}in_nvram_procedure++;//REQ消息發完了,接下來就等RSP消息來while(1){/*ifmorethan1accessrequestexist,gothroughthecircularQ*/if((nvram_req_count>0)&&(circularQ_check_result==circularQ_check_never_check)){circularQ_check_result=NVRAMCheckCircularQ(&queueNode,nFileId);}if(circularQ_check_result!=circularQ_check_found){OslReceiveMsgExtQ(mmi_ext_qid,&queueNode);OslGetMyTaskIndex(&my_index);OslStackSetActiveModuleID(my_index,MOD_MMI);}//這個標志位先置空,不管,先記住它toPush=MMI_FALSE;switch(queueNode.msg_id){//這里列出了很多消息,其他不管,先找READ_RSP消息再說caseMSG_ID_MMI_EQ_PLAY_AUDIO_RSP:caseMSG_ID_MMI_EQ_STOP_AUDIO_RSP:caseMSG_ID_MMI_EQ_EXE_GPIO_LEVEL_RSP:caseMSG_ID_MMI_EQ_SET_VOLUME_RSP:caseMSG_ID_MMI_EQ_KEYPAD_DETECT_IND:caseMSG_ID_TIMER_EXPIRY://就它了caseMSG_ID_MMI_EQ_NVRAM_READ_RSP:{mmi_eq_nvram_read_rsp_struct*readMessage;readMessage=(mmi_eq_nvram_read_rsp_struct*)queueNode.oslDataPtr;{if(readMessage->result.flag==MMI_OK){ //讀成功了,再比較一下數據大小是不是合格if(readMessage->length>nBufferSize){}elseif(readMessage->length<nBufferSize){}else{memcpy(pBuffer,readMessage->data,readMessage->length);*pError=NVRAM_READ_SUCCESS;}status=readMessage->length;}OslFreeInterTaskMsg(&queueNode);}toPush=MMI_TRUE;break;}caseMSG_ID_MMI_EQ_NVRAM_WRITE_RSP:}//這個flag標志是否讀取成功if(toPush==MMI_TRUE){ilm_structilm_ptr;flag=OslWriteCircularQ(&ilm_ptr);OslFreeInterTaskMsg(&queueNode);}}}AccessRecordInt總結:這個函數是個真正的讀取函數,發REQ消息給NVRAMTASK,等待RSP消息,得到讀取數據.寫入流程重點分析WriteValueInt這個函數S32WriteValueInt(U8nDataItemId,void*pBuffer,U8nDataType,S16*pError,S8*fileName,S32lineNumber){switch(nDataType){//還拿BYTE來說caseDS_BYTE:{ //已經從NVRAM到CACHE里面了/*secondtimeaccess,italwayssetstherequestitem*/if(byteDataReadFlag){/*DataiscachednoneedtoreadfromNVRAM*/memcpy(&byte_data[nDataItemId*nDataType],pBuffer,nDataType);/*writeintoNVRAMmodule,ifnotwaitforfalshingdirectly*/if(!byteDataWriteFlashFlag){status=WriteRecordInt(NVRAM_EF_CACHE_BYTE_LID,1,byte_data,NVRAM_CACHE_SIZE,&error,fileName,lineNumber);}status=DS_BYTE;error=NVRAM_WRITE_SUCCESS;} //還沒有讀到CACHE里面/*processfirsttimeaccessalldataandreturnfirstwriteitemdata*/else{ //那就讀到CACHE/*ReadalldatafromtheNVRAMfile*/status=ReadRecordInt(NVRAM_EF_CACHE_BYTE_LID,1,byte_data,NVRAM_CACHE_SIZE,&error,fileName,lineNumber);memcpy(&byte_data[nDataItemId*nDataType],pBuffer,nDataType); //讀好了,就寫吧/*writeintoNVRAMmodule,ifnotwaitforfalshingdirectly*/if(!byteDataWriteFlashFlag){ //關鍵還是WriteRecordIntstatus=WriteRecordInt(NVRAM_EF_CACHE_BYTE_LID,1,byte_data,NVRAM_CACHE_SIZE,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論