MTK中的nvram的操作實(shí)現(xiàn)_第1頁(yè)
MTK中的nvram的操作實(shí)現(xiàn)_第2頁(yè)
MTK中的nvram的操作實(shí)現(xiàn)_第3頁(yè)
MTK中的nvram的操作實(shí)現(xiàn)_第4頁(yè)
MTK中的nvram的操作實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

NVRAM讀寫操作詳解在MTK中,NVRAM是作為一個(gè)獨(dú)立的task來(lái)運(yùn)行的。在nvram_main.c文件中,(代碼有刪減,注釋部分用黃色標(biāo)出,便于閱讀)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函數(shù),處理NVRAM相關(guān)的消息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處理幾個(gè)消息.READ流程從NV中讀取一個(gè)數(shù)據(jù),例如讀取語(yǔ)言設(shè)置信息:ReadValue(NVRAM_SETTING_LANG,&data,DS_BYTE,&error);我們需要注明,NVRAM的LID,讀取數(shù)據(jù)存放的指針,數(shù)據(jù)類型,和返回錯(cuò)誤信息的地址.#defineReadValue(nId,pBuffer,nDataType,pError)\ReadValueInt(nId,pBuffer,nDataType,pError,__FILE__,__LINE__)ReadValue精簡(jiǎn)了兩個(gè)參數(shù),不需要注明文件和第多少行,方面了應(yīng)用使用.看一下ReadValueInt這個(gè)函數(shù).我們來(lái)看看這個(gè)函數(shù)到底干了什么事情:S32ReadValueInt(U8nDataItemId,void*pBuffer,U8nDataType,S16*pError,S8*fileName,S32lineNumber){switch(nDataType){caseDS_BYTE:{ //byteDataReadFlag先記住這個(gè)標(biāo)志,它標(biāo)志了byte的數(shù)據(jù)是否已經(jīng)被讀取,所以從這里我們可以猜測(cè),NVRAM的數(shù)據(jù),應(yīng)該不是每次都從硬件讀取的,而是有緩存的(記住這個(gè)假設(shè),稍后驗(yàn)證)/*secondtimereading,italwasyreturnonerequestitem*/if(byteDataReadFlag){ //這個(gè)注釋就更加明白了/*DataiscachednoneedtoreadfromNVRAM*/memcpy(pBuffer,&byte_data[nDataItemId*nDataType],nDataType);status=DS_BYTE;error=NVRAM_READ_SUCCESS;}/*processfirsttimereadingalldataandreturnfirstrequestitemdata*/else{/*ReaddatafromtheNVRAMfile*/ //這才從NVRAM文件中讀取 //這個(gè)BUFFER的大小,8*512=4KU8tempBuffer[NVRAM_CACHE_SIZE]; //這個(gè)函數(shù)重點(diǎn)分析status=ReadRecordInt(NVRAM_EF_CACHE_BYTE_LID,1,tempBuffer,sizeof(tempBuffer),&error,fileName,lineNumber);/*copyoutalltotalreadingdata*/ //把讀取的數(shù)據(jù)copy到byte_data里面去memcpy(byte_data,tempBuffer,sizeof(tempBuffer)); //這個(gè)時(shí)候把這個(gè)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總結(jié):這個(gè)函數(shù),就是把以前讀好的三個(gè)數(shù)組的數(shù)據(jù)拿出來(lái),如果還沒(méi)有從NVRAM讀取到cashe里面,就讀一次.關(guān)鍵的函數(shù)是:ReadRecordInt.第一次讀BYTE類型的數(shù)據(jù)之前,三個(gè)數(shù)組都是空的,flag也是空的,讀一個(gè)之后,byte數(shù)據(jù)被從NVRAM文件中讀入到cashe中,放在byte的數(shù)組里面,byteflag也被置上了.下次再讀的byte,就只需要從CACHE中讀取就可以了.同理,short和double數(shù)據(jù)也相同.來(lái)看看它是怎么做的#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的再說(shuō)}else{ //發(fā)了一個(gè)消息 SendNVRAMReadReq(nFileId,nRecordId,nRecordAmount);//這個(gè)函數(shù)調(diào)用了Message.oslMsgId=MSG_ID_MMI_EQ_NVRAM_READ_REQ;//OslMsgSendExtQueue(&Message),發(fā)了一個(gè)REQ消息到Q上去.}in_nvram_procedure++;//REQ消息發(fā)完了,接下來(lái)就等RSP消息來(lái)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);}//這個(gè)標(biāo)志位先置空,不管,先記住它toPush=MMI_FALSE;switch(queueNode.msg_id){//這里列出了很多消息,其他不管,先找READ_RSP消息再說(shuō)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){ //讀成功了,再比較一下數(shù)據(jù)大小是不是合格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:}//這個(gè)flag標(biāo)志是否讀取成功if(toPush==MMI_TRUE){ilm_structilm_ptr;flag=OslWriteCircularQ(&ilm_ptr);OslFreeInterTaskMsg(&queueNode);}}}AccessRecordInt總結(jié):這個(gè)函數(shù)是個(gè)真正的讀取函數(shù),發(fā)REQ消息給NVRAMTASK,等待RSP消息,得到讀取數(shù)據(jù).寫入流程重點(diǎn)分析WriteValueInt這個(gè)函數(shù)S32WriteValueInt(U8nDataItemId,void*pBuffer,U8nDataType,S16*pError,S8*fileName,S32lineNumber){switch(nDataType){//還拿BYTE來(lái)說(shuō)caseDS_BYTE:{ //已經(jīng)從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;} //還沒(méi)有讀到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){ //關(guān)鍵還是WriteRecordIntstatus=WriteRecordInt(NVRAM_EF_CACHE_BYTE_LID,1,byte_data,NVRAM_CACHE_SIZE,

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論