高通平臺(tái)讀寫(xiě)nv總結(jié)
一,引言
1. 什么是NV
高通平臺(tái)的NV,保存了系統(tǒng)運(yùn)行過(guò)程中各個(gè)模塊可能用到的一些參數(shù)值,它是以單個(gè)文件的形式保存在EFS中,但用戶是不能隨意訪問(wèn)的,只能通過(guò)QXDM來(lái)進(jìn)行讀寫(xiě)。對(duì)于60X0平臺(tái),NV就有將近5千多項(xiàng)。
2. 為什么要備份恢復(fù)NV
NV值是需要通過(guò)校準(zhǔn)和終測(cè)才能使手機(jī)硬件達(dá)到最佳工作狀態(tài),特別是其中的RF相關(guān)的NV項(xiàng),經(jīng)過(guò)校準(zhǔn)及終測(cè)后,每臺(tái)手機(jī)的這些NV值基本上都不一樣,又加上NV數(shù)據(jù)是是存儲(chǔ)在EFS,而EFS的數(shù)據(jù)很可能遭到破壞(如:重新燒寫(xiě)版本),這時(shí)的NV數(shù)據(jù)也將被破壞,之前校準(zhǔn)和終測(cè)后的NV數(shù)據(jù)也將無(wú)法恢復(fù),使得手機(jī)將面臨重新走校準(zhǔn)、終測(cè)的生產(chǎn)流程。
3. 備份恢復(fù)的原則
備份:首先要確定需要備份的NV有那些項(xiàng)(一般是RF相關(guān)的),一旦檢測(cè)到對(duì)NV項(xiàng)的修改,則在EFS中創(chuàng)建一個(gè)標(biāo)志文件,在每次開(kāi)機(jī)時(shí)判斷這個(gè)標(biāo)志文件是否存在而執(zhí)行是否做備份。
恢復(fù):同樣在每次開(kāi)機(jī)的時(shí)候判斷EFS中是否存在恢復(fù)標(biāo)志文件,如果不存在則恢復(fù)NV,然后創(chuàng)建這個(gè)標(biāo)志文件,創(chuàng)建成功后,下次開(kāi)機(jī)就會(huì)不進(jìn)行恢復(fù)。
二,NV的備份
1. 備份的區(qū)域
由于所需要備份的NV項(xiàng)不是很多(一般就幾十項(xiàng)),所以我們可以在FLASH上開(kāi)辟一塊區(qū)域?qū)iT(mén)用于保存NV備份數(shù)據(jù)。備份區(qū)域是以一定的組織格式來(lái)存放數(shù)據(jù)的(如圖):
其中每個(gè)Item都是以:Item號(hào)+內(nèi)容大小(Byte)+內(nèi)容 的形式來(lái)存放的。比如第10項(xiàng)NV可能有2個(gè)值,分別是0x11,0x22,則它在FLASH中存放的形式就是:
0a 00 00 00 02 00 00 00 11 22 --------(這里Item號(hào)、內(nèi)容大小都是UINT32 類(lèi)型)。
2. 備份的時(shí)機(jī)
一般一臺(tái)機(jī)器在出廠前,都要通過(guò)終測(cè)儀進(jìn)行校準(zhǔn)、終測(cè)。這個(gè)過(guò)程就會(huì)修改到一些RF相關(guān)的NV項(xiàng),也就是我們需要備份的NV。對(duì)于軟件上來(lái)說(shuō),不管是用終測(cè)儀,或則高通的QPST,QXDM工具來(lái)修改NV項(xiàng),最后都會(huì)調(diào)用到寫(xiě)NV的函數(shù):nvdiag_write(),我們可以在這個(gè)函數(shù)里面創(chuàng)建備份標(biāo)志文件,在下次系統(tǒng)啟動(dòng)時(shí)讀取這個(gè)文件是否存在來(lái)判斷是否要做備份。
3. 備份的方法
之前說(shuō)過(guò),高通的NV都是以單個(gè)文件的形式存放在EFS中,每個(gè)文件的文件名就是NV項(xiàng)的序列號(hào),所以我們可以直接調(diào)用EFS的讀函數(shù)nv_read來(lái)讀取某個(gè)特定的NV項(xiàng)的值。
三,NV的恢復(fù)
1. 恢復(fù)的時(shí)機(jī)
恢復(fù)就是備份的逆過(guò)程,即把存放在FLASH中的備份數(shù)據(jù)恢復(fù)到EFS中對(duì)應(yīng)的NV項(xiàng)中去。如果手機(jī)出廠以后一旦要進(jìn)行軟件升級(jí),并且同時(shí)需要破壞EFS,則就不得不進(jìn)行NV項(xiàng)的恢復(fù)。所以系統(tǒng)在每次開(kāi)機(jī)運(yùn)行時(shí),都會(huì)檢查文件系統(tǒng)中是否存在恢復(fù)標(biāo)志文件,如果不存在則進(jìn)行恢復(fù)并創(chuàng)建;反之則不恢復(fù)。這就要求我們每次發(fā)布的軟件版本中打包的EFS不能包含這個(gè)標(biāo)志文件。
2. 恢復(fù)的方法
進(jìn)行恢復(fù)的時(shí)候就要讀取備份區(qū)域中備份的每項(xiàng)NV,然后同樣調(diào)用EFS的寫(xiě)函數(shù)nv_write把數(shù)據(jù)寫(xiě)到對(duì)于的NV項(xiàng)中。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。