從A33移植ICM20608D談Android sensors移植

在A33上移植ICM20608D,歷時3.5天。回顧該Sneosr移植、調試歷程,沒有產生過多障礙及意外。能夠說,一切按設想中的樣子演進。16日下午完成了linux driver及android hal的移植,確認sensor工做正常,interrupt可產生,driver可做出響應。17日及18日,熟悉代碼及調試。19日供應商現場支持,收官。linux

Android sensors的移植方法,能夠歸納爲如下步驟:android

  1. 確認硬件線路是否正確。
  2. 移植sensor driver。
  3. 脫離HAL層對driver及sensor進行調試,確認sensor工做是否正常,driver是否移植正確。
  4. 移植HAL層,結合HAL及driver調試。
  5. 必要時檢查SensorService。

若上述5步作到位但未獲得預期結果,迅速聯繫供應商作現場支持。shell

 

第1點沒必要多說,讀懂原理圖是做爲嵌入式軟件工程師的基本素質。函數

第2點是移植driver,通常來講,供應商會給到某平臺的適用source code,不必定是全志平臺,但必須是可用的,完整的source code。移植driver要作的工做通常是:工具

  • linux core打開driver所須要的外部模塊及代碼。
  • 根據平臺特性加入driver private data。
  • 根據平臺特性加入bus識別sensor的代碼。
  • 根據平臺特性完成中斷/喚醒等gpio申請註冊使用。

 

將驅動代碼正確移植到平臺,成功編譯後。須要檢查軟件代碼在時序上是否知足sensor工做所需的時序,sensor的中斷是否合理地產生,driver的中斷處理函數是否合理地進行響應。spa

第3點至關重要,在移植HAL以前,必須想辦法嘗試脫離HAL層的影響對底層進行debug確認。仔細閱讀ICM20608D驅動代碼後,不難發現,驅動裏面會產生若干節點,其中就包括讀取sensor registers當前值的節點及其餘重要的節點。另外,在HAL代碼中,也存在好幾個調試用的工具源碼,好比selftest、mpu_iio等。能夠將它們編譯出現,在shell中直接執行。debug

第4點是移植HAL層代碼,將HAL代碼存放到android/hardware下,全志平臺加載sensor hal是根據sensors.<platform>.so的規劃進行加載,所以,應優先將LOCAL_MODULE的值修改成sensors.$(TARGET_BOARD_PLATFORM)。因爲HAL層代碼不一樣產家規範不同,很難抽象出能適用於全部sensor hal移植的方法論。可是,只要代碼自己是完整的,經過閱讀代碼,編譯,debug,成功移植只是時間問題。調試

HAL代碼向上註冊硬件設備使用是公共的規範和接口,通常來講,不須要太懷疑SensorService的正確性。code

若是說經歷了上面的過程,sensor仍然沒有辦法在系統中正常使用起來,就應該堅決果斷地約供應商技術人員過來現場支持。緣由有:orm

  • HAL層及如下的代碼,各家有各家的規範,應優先找產家支持。
  • 供應商比咱們更熟悉他們的代碼。
  • 供應商能夠找到Sensor的原廠支持。

 

總結:

  1. 在Android System移植sensor代碼,要注意向供應商確認代碼的完整性和準確性。通常來講拿過來能夠編譯經過並使用的狀況比較少,仍是需要工程師耐心地移植調試。一步一步去完成。
  2. Android System不一樣於Melis等小型專用系統,全志的linux core也是抓取自公共linux core的sunxi分支,如非全志有意封裝,都可視爲通用模塊。
  3. 在移植工做已經基本作到位,不存在中斷申請錯誤等低級問題的前提下,應大膽申請供應商技術支持,推動調試進度。
相關文章
相關標籤/搜索