1. 程式人生 > >高通平臺讀寫nv總結【轉】

高通平臺讀寫nv總結【轉】

本文轉載自:https://blog.csdn.net/suofeng12345/article/details/52713993

一,引言
      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進行同時讀寫導致的,有待進一步驗證。