一,引言
1. 什麼是nv
高通平台的nv,儲存了系統執行過程中各個模組可能用到的一些引數值,它是以單個檔案的形式儲存在efs中,但使用者是不能隨意訪問的,只能通過qxdm來進行讀寫。對於60x0平台,nv就有將近5千多項。
2. 為什麼要備份恢復nv
nv值是需要通過校準和終測才能使手機硬體達到最佳工作狀態,特別是其中的rf相關的nv項,經過校準及終測後,每台手機的這些nv值基本上都不一樣,又加上nv資料是是儲存在efs,而efs的資料很可能遭到破壞(如:重新燒寫版本),這時的nv資料也將被破壞,之前校準和終測後的nv資料也將無法恢復,使得手機將面臨重新走校準、終測的生產流程。
3. 備份恢復的原則
備份:首先要確定需要備份的nv有那些項(一般是rf相關的),一旦檢測到對nv項的修改,則在efs中建立乙個標誌檔案,在每次開機時判斷這個標誌檔案是否存在而執行是否做備份。
恢復:同樣在每次開機的時候判斷efs中是否存在恢復標誌檔案,如果不存在則恢復nv,然後建立這個標誌檔案,建立成功後,下次開機就會不進行恢復。
二,nv的備份
1. 備份的區域
由於所需要備份的nv項不是很多(一般就幾十項),所以我們可以在flash上開闢一塊區域專門用於儲存nv備份資料。備份區域是以一定的組織格式來存放資料的(如圖):
其中每個item都是以:
item號+內容大小(byte)+內容
的形式來存放的。比如第10項nv可能有2個值,分別是0x11,0x22,則它在flash中存放的形式就是:
0a 00 00 00 02 00 00 00 11 22 --------(這裡item號、內容大小都是uint32 型別)。
2. 備份的時機
一般一台機器在出廠前,都要通過終測儀進行校準、終測。這個過程就會修改到一些rf相關的nv項,也就是我們需要備份的nv。對於軟體上來說,不管是用終測儀,或則高通的qpst,qxdm工具來修改nv項,最後都會呼叫到寫nv的函式:nvdiag_write(),我們可以在這個函式裡面建立備份標誌檔案,在下次系統啟動時讀取這個檔案是否存在來判斷是否要做備份。
3. 備份的方法
之前說過,高通的nv都是以單個檔案的形式存放在efs中,每個檔案的檔名就是nv項的序列號,所以我們可以直接呼叫efs的讀函式nv_read來讀取某個特定的nv項的值。
三,nv的恢復
1. 恢復的時機
恢復就是備份的逆過程,即把存放在flash中的備份資料恢復到efs中對應的nv項中去。如果手機出廠以後一旦要進行軟體公升級,並且同時需要破壞efs,則就不得不進行nv項的恢復。所以系統在每次開機執行時,都會檢查檔案系統中是否存在恢復標誌檔案,如果不存在則進行恢復並建立;反之則不恢復。這就要求我們每次發布的軟體版本中打包的efs不能包含這個標誌檔案。
2. 恢復的方法
進行恢復的時候就要讀取備份區域中備份的每項nv,然後同樣呼叫efs的寫函式nv_write把資料寫到對於的nv項中。
四,小結
目前幾個專案都是使用這套備份恢復機制,通過反覆實驗,沒有發現什麼問題。之前的恢復標誌是放在flash中,即在公升級版本的時候在flash中設定乙個標誌位,在公升級完成以後開機,讀取這個標誌位,如果存在則恢復,恢復成功後清除這個標誌。但是在乙個手機專案(採用spansion 250m nor+ 128m ram)經常遇到公升級完版本開機執行緩慢的bug,通過跟蹤發現是在清除恢復標誌的時候出了問題,之後把恢復標誌也放到efs中,這個bug就沒有出現。 現在懷疑是在恢復的時候,對flash的乙個bank進行同時讀寫導致的,有待進一步驗證。
原文出處:
高通平台讀寫nv總結
一,引言 1.什麼是nv 高通平台的nv,儲存了系統執行過程中各個模組可能用到的一些引數值,它是以單個檔案的形式儲存在efs中,但使用者是不能隨意訪問的,只能通過qxdm來進行讀寫。對於60x0平台,nv就有將近5千多項。2.為什麼要備份恢復nv nv值是需要通過校準和終測才能使手機硬體達到最佳工作...
高通平台讀寫nv總結
一,引言 1.什麼是nv 高通平台的nv,儲存了系統執行過程中各個模組可能用到的一些引數值,它是以單個檔案的形式儲存在efs中,但使用者是不能隨意訪問的,只能通過qxdm來進行讀寫。對於60x0平台,nv就有將近5千多項。2.為什麼要備份恢復nv nv值是需要通過校準和終測才能使手機硬體達到最佳工作...
高通平台Bring up
3.2.amss 部分編譯 主要由以下部分構成 adsp,boot,debug,modem,rpm,trustzone,wcnss,分別根據高通的說明編譯這些模組,不過其中有些模組我們不會改,直接用release的binary檔案就行,比如 debug,rpm,trustzone,wcnss。3.3...