大致流程:APP —> Framework —> lib —> HAL
HAL 層以下部分,不同平台實現方式不同,
可能會是 HAL —> Kernel 也可能是 HAL —> Vendor —> Kernel,
有些平台 HAL 層之後直接對接 Kernel 的 input 子系統,這個相對簡單;
有些是 HAL —> QMI —> SSC,這我沒碰過。
這裡不對這些做說明,
只關注 AOSP HAL 層以上的部分。
Android 傳感器框架中包括物理傳感器和虛擬傳感器兩大類:
這兩類傳感器單次數據量比較小,目前種類共有30多種。
(在 hardware/libhardware/include/hardware
中 sensors.h
可以查閱),
市場中還存在一些其它傳感器,
如相機中的傳感器、指紋傳感器、觸摸傳感器。
因功能複雜且特殊被放在單獨模塊中處理,
並不包含在傳感器框架中,
物理傳感器和虛擬傳感器對於應用程序來說沒什麼區別,
AOSP 部分已將這部分做了一致處理。
不同的傳感器的上報方式不同,
根據實際情況進行設定,目前支持有四種上報方式:
所謂的喚醒是指是否能夠喚醒SOC處理器來處理事件,
當 SOC 處於睡眠狀態時,
喚醒傳感器可以將 SOC 喚醒處理必要的事件。
另外同一個傳感器可以同時被定義為喚醒傳感器和非喚醒傳感器,
兩者相對獨立。
Android 平台可以依賴原始的9軸數據(加速度計、陀螺儀、指南針),
融合出旋轉矢量、重力和線性加速度這些虛擬傳感器給應用程序使用。
簡單講其實就是把多個單一傳感器,
透過演算法合體成一個,蠻酷的對吧!
其實看過程式碼原理蠻簡單的,
但沒什麼興趣深追,只要可以用就好。(笑)
目前介紹就先這樣,
下一篇就正式來追程式碼囉!