国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

新手必看!Android Light HAL開發實戰(Rockchip 15 AIDL版)

jf_44130326 ? 來源:Linux1024 ? 作者:Linux1024 ? 2026-03-04 08:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Android底層開發的同學,肯定繞不開燈光控制”——手機屏幕背光、按鍵燈、呼吸燈,這些功能的底層實現都依賴Light HAL。今天就以Rockchip瑞芯微Android 15平臺為例,用最通俗的語言拆解Light HAL的核心邏輯,新手也能看懂!

一、先搞懂:什么是Light HAL?

在開始看代碼前,先理清3個核心概念,避免越看越懵:

1. HAL是什么?

HAL(硬件抽象層)是Android系統“Framework硬件驅動之間的橋梁。Framework層負責上層邏輯(比如APP調調亮屏幕),驅動負責直接操作硬件,HAL則把驅動接口封裝成標準形式,讓Framework不用關心不同廠商的硬件差異。

2. Light HAL的作用?

專門負責燈光類硬件的控制,比如:

?屏幕背光(BACKLIGHT)的亮度調節;

?按鍵燈(BUTTONS)的開關;

?通知燈(NOTIFICATIONS)的呼吸/常亮效果;

?電池燈(BATTERY)的顏色/閃爍控制。

3. AIDLHAL

Android 10+后,HAL逐漸從舊的HIDL遷移到AIDLAndroid接口定義語言),核心是用Binder通信,讓HAL服務以進程形式運行,更穩定、權限控制更清晰。

二、核心代碼拆解:Rockchip Light HAL文件全解析

瑞芯微的Light HAL代碼都在light_aidl目錄下,核心文件就5個,我們逐個講清楚作用:

1.頭文件:Lights.h(定義骨架

// 關鍵代碼片段classBacklightPath{public: intphysic_id;   // 顯示屏物理ID(多屏場景用) charbacklight_path[128];// 背光驅動的sysfs路徑};classLights:publicBnLights { // Framework調用的核心接口:設置燈光狀態(比如調亮度) ndk::ScopedAStatussetLightState(intid,constHwLightState& state)override; // Framework調用的核心接口:獲取設備支持的燈光類型 ndk::ScopedAStatusgetLights(std::vector* types)override;private: // 輔助函數:添加支持的燈光類型(比如“背光”“按鍵燈”) voidaddLight(intconstordinal, LightTypeconsttype); // 存儲支持的燈光列表  std::vector _lights; // 存儲多屏背光的路徑(瑞芯微多屏方案的核心)  std::vector _backlights;};

新手理解:這個文件就像設計圖,定義了兩個核心:

?BacklightPath:解決多屏設備的背光路徑問題(比如平板/工控機有多個屏幕);

?Lights類:實現了Android標準的BnLights接口,對外暴露設置燈光獲取燈光兩個核心方法,是整個HAL的骨架。

2.實現文件:Lights.cpp(填充血肉

這是核心邏輯文件,所有燈光控制的實際操作都在這里,新手重點看3個核心函數:

1getDriverPath:定義燈光的驅動路徑

constchar*getDriverPath(LightType type){ switch(type) {   caseLightType:     return"/sys/class/backlight/backlight/brightness";// 背光驅動路徑   caseLightType:     return"/sys/class/leds/button-backlight/brightness";// 按鍵燈路徑   // 通知燈/電池燈等指向LED驅動目錄   caseLightType:   caseLightType:     return"/sys/class/leds";   default:     return"/not_supported";  }}

新手理解Android控制硬件的核心是操作sysfs(虛擬文件系統),比如想調背光,本質就是往/sys/class/backlight/backlight/brightness文件里寫數字(0-255),這個函數就是給不同燈光找對應的文件路徑。

2write_int:往驅動文件寫值(操作硬件)

staticintwrite_int(constchar* path,intvalue){ intfd =open(path, O_RDWR);// 打開驅動文件 if(fd >=0) {   charbuf[20];   snprintf(buf,sizeof(buf),"%dn", value);// 把亮度值轉成字符串   write(fd, buf,strlen(buf));// 寫入文件(真正調亮度的操作)   close(fd);   return0;  }else{   ALOGE("打開文件失敗:%s",strerror(errno));   return-errno;  }}

新手理解:這是最底層的硬件操作函數,比如Framework要求把背光調到100”,最終就是這個函數往背光路徑里寫“100”,驅動收到后就會調屏幕亮度。

3setLightState:處理Framework的調用請求

ndk::ScopedAStatusLights::setLightState(int id,constHwLightState& state) { // 1. 根據id找到對應的燈光類型(比如是背光還是按鍵燈) // 2. 找到該燈光的驅動路徑 // 3. 調用setLightFromType,最終調用write_int寫值到驅動 // 4. 返回操作結果(成功/失?。?/span>}

新手理解Framework層調用Light HAL時,直接調用這個函數,它是上層請求底層操作的中轉站。

3.入口文件:main.cpp(啟動HAL服務)

int main() { //1. 初始化Binder線程池(AIDL通信的基礎) ABinderProcess_setThreadPoolMaxThreadCount(0); //2. 創建Lights實例(真正處理燈光邏輯的對象)  std::shared_ptr<Lights> lights = ndk::SharedRefBase::make(); //3. 把HAL服務注冊到系統的ServiceManagerFramework能找到這個服務)  const std::string instance = std::string() +Lights::descriptor+"/default"; AServiceManager_addService(lights->asBinder().get(), instance.c_str()); //4. 進入線程池,等待Framework的調用(常駐進程) ABinderProcess_joinThreadPool(); returnEXIT_FAILURE;}

新手理解:這個文件是HAL服務的啟動入口,就像你開餐館,main.cpp就是開門營業的操作:

?初始化通信(Binder線程池);

?準備好廚師(Lights實例);

?告訴顧客(Framework我在這營業(注冊服務);

?坐等顧客下單(等待Framework調用)。

4.配置文件:lights-rockchip.xml(聲明HAL服務)

<manifestversion="1.0"type="device"> <halformat="aidl">   <name>android.hardware.lightname>   <version>2version>   <fqname>ILights/defaultfqname> hal>manifest>

新手理解:這個文件是給系統看的說明書,告訴Android系統:我是Light HAL服務,版本是2,接口名是ILights/default”,系統會通過這個文件校驗HAL的兼容性,確保Framework能正確調用。

5.啟動配置:lights-rockchip.rc(系統啟動HAL

service vendor.light-rockchip/vendor/bin/hw/android.hardware.lights-service.rockchip  class hal usersystem groupsystem  shutdown critical

新手理解Android開機后,init進程會掃描這個文件,然后自動啟動Light HAL服務:

?class hal:屬于HAL類服務,系統啟動時會批量啟動;

?user system:以system用戶運行(保證能讀寫驅動文件);

?shutdown critical:關鍵服務,崩潰會重啟,關機要等它退出。

Light HAL服務完整啟動流程圖

用流程圖直觀展示系統開機后,HAL服務如何啟動,一看就懂:

wKgZO2mneYWAMPDVAAD1p8N_j4E349.png

三、整體運行流程:從調亮度硬件響應

新手最容易懵的是代碼怎么串起來的,用調屏幕亮度舉例子,先看流程圖,再看步驟:

wKgZO2mneYWAepSVAALqUMV9buQ101.png

對應流程圖,完整流程拆解(7步):

1.系統開機init進程掃描lights-rockchip.rc,啟動android.hardware.lights-service.rockchip可執行文件;

2.啟動HAL服務:執行main.cpp,創建Lights實例,注冊服務到ServiceManager,等待調用;

3.上層發起請求:比如設置里調亮度,Framework層找到“ILights/default”服務,調用setLightState;

4.HAL處理請求setLightState根據燈光id找到背光驅動路徑;

5.底層操作:調用write_int/sys/class/backlight/backlight/brightness寫亮度值;

6.驅動響應:內核驅動收到文件寫入操作,控制屏幕背光硬件調亮度;

7.返回結果HAL把操作結果返回給Framework,整個流程結束。

四、避坑指南

1.路徑錯誤:驅動路徑寫錯(比如多屏場景背光路徑不對),會導致調亮度沒反應,重點查getDriverPathdisplay_settings.xml

2.權限問題HAL服務運行用戶不是system,會導致打不開驅動文件,查lights-rockchip.rcuser/group;

3.接口兼容lights-rockchip.xml的版本和接口名不對,Framework找不到服務,重點核對name/version/fqname;

4.多屏場景:瑞芯微多屏設備要注意BacklightPath的物理ID,否則只會調其中一個屏幕。

五、總結

Rockchip Light HAL的核心邏輯其實很簡單:

?Lights.h定義接口骨架;

?Lights.cpp實現硬件操作邏輯;

?main.cpp啟動并注冊HAL服務;

?rc/xml配置服務啟動和系統識別;

?本質是Framework的請求轉成往sysfs文件寫值。

對新手來說,先搞懂“sysfs操作硬件這個核心,再順著“Framework→HAL→驅動的鏈路看代碼,就不會亂。建議先改改背光路徑、調個亮度值,動手比只看代碼更易理解!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    4024

    瀏覽量

    133967
  • Linux
    +關注

    關注

    88

    文章

    11758

    瀏覽量

    219001
  • Rockchip
    +關注

    關注

    0

    文章

    92

    瀏覽量

    19577
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    RK3576 Android15音頻開發必看:alsa_route核心文件解析與修改場景

    HAL層的核心。今天我們就聊聊: 什么情況下需要動這兩個文件?遇到問題該怎么改? 一、先搞懂:alsa_route到底是什么? 在RK3576 Android15
    的頭像 發表于 02-26 08:08 ?78次閱讀
    RK3576 <b class='flag-5'>Android15</b>音頻<b class='flag-5'>開發</b><b class='flag-5'>必看</b>:alsa_route核心文件解析與修改場景

    RK3576平臺Android HAL層故障排查:從lshal命令看透問題本質

    ? ? ? 在 Android 嵌入式開發中, HAL (硬件抽象層)是連接系統框架與硬件驅動的核心橋梁,一旦 HAL 層出問題,音頻、藍牙、傳感器等硬件功能都會直接 “ 罷工 ” 。
    的頭像 發表于 02-06 07:12 ?166次閱讀
    RK3576平臺<b class='flag-5'>Android</b> <b class='flag-5'>HAL</b>層故障排查:從lshal命令看透問題本質

    硬核進階:RK3576 Android15?驅動與系統開發實戰指南

    android15,想與大家探討更多,不僅僅是驅動,更包含android其他方面。 各位嵌入式與Android開發的朋友們,我們的? RK3576
    的頭像 發表于 01-26 22:29 ?627次閱讀
    硬核進階:RK3576 <b class='flag-5'>Android15</b>?驅動與系統<b class='flag-5'>開發</b><b class='flag-5'>實戰</b>指南

    深入解析rk平臺Android Bootloader核心代碼:從啟動流程到AVB驗證

    android_bootloader.c的核心代碼,帶你讀懂Android設備從Bootloader到內核的完整啟動邏輯,以及開發者關注這些代碼的核心價值。 一、代碼整體定位 這份代碼是Ro
    的頭像 發表于 01-22 07:06 ?249次閱讀
    深入解析rk平臺<b class='flag-5'>Android</b> Bootloader核心代碼:從啟動流程到AVB驗證

    新手必看!華潤微7388全系統改裝零失敗復盤,這些坑我替你踩過了

    標簽:#華潤微7388 #新手改裝實戰 #車載音響DIY #改裝避坑手冊 #功放芯片實操
    的頭像 發表于 12-19 10:49 ?700次閱讀

    【RK3568 NPU實戰】別再閑置你的NPU!手把手帶你用迅為資料跑通Android AI檢測Demo,附完整流程與效果

    【RK3568 NPU實戰】別再閑置你的NPU!手把手帶你用迅為資料跑通Android AI檢測Demo,附完整流程與效果
    的頭像 發表于 11-10 15:58 ?1056次閱讀
    【RK3568 NPU<b class='flag-5'>實戰</b>】別再閑置你的NPU!手把手帶你用迅為資料跑通<b class='flag-5'>Android</b> AI檢測Demo,附完整流程與效果

    實戰RK3568性能調優:如何利用迅為資料壓榨NPU潛能-在Android系統中使用NPU

    實戰RK3568性能調優:如何利用迅為資料壓榨NPU潛能-在Android系統中使用NPU》
    的頭像 發表于 11-07 13:42 ?635次閱讀
    <b class='flag-5'>實戰</b>RK3568性能調優:如何利用迅為資料壓榨NPU潛能-在<b class='flag-5'>Android</b>系統中使用NPU

    嵌入式入門必看!迅為RK3568?V2.0升級,新手也能輕松玩轉

    嵌入式入門必看!迅為RK3568?V2.0升級,新手也能輕松玩轉
    的頭像 發表于 10-28 13:26 ?427次閱讀
    嵌入式入門<b class='flag-5'>必看</b>!迅為RK3568?V2.0升級,<b class='flag-5'>新手</b>也能輕松玩轉

    RNKK Android人體姿態識別開發指南

    Android平臺上利?Rockchip芯?的NPU實現?體姿態識別,可以顯著提升應?性能并降低能耗。本?將詳細闡述如何通過RKNN API構建?個?效的?體姿態識別系統,從模型準備、RKNN轉換、NDK集成到最終的圖像處理與可視化全流程。
    發表于 09-26 16:37 ?0次下載

    谷歌全新Android助力提高開發效率

    隨著 Android 的更新,加上 AI 的接入與賦能,讓 Android 開發新范式正在加速成型。
    的頭像 發表于 08-29 09:22 ?851次閱讀

    itop-3588開發Android系統開發筆記-旋轉 Android系統

    屏幕旋轉包括倆個部分:Android 顯示旋轉和 Recovery 顯示旋轉在開發的過程中,我們使用的屏幕可能是物理橫屏或者物理豎屏,如果我們想要物理橫屏 顯示為豎屏,物理豎屏顯示為橫屏時,也就
    發表于 05-19 11:04

    HAL15xy_SOT23

    HAL1501SU-A,HAL1502SU-A,HAL1503SU-A,HAL1504SU-A,HAL1505SU-A,
    發表于 05-14 15:03 ?0次下載

    新手必看:動態住宅 IP 的核心原理與實戰指南

    維服務商評估模型(網絡質量、協議支持、合規保障、運維能力、成本效益),為開發者提供兼顧效率與安全的實戰指南。
    的頭像 發表于 04-22 16:57 ?1264次閱讀

    Android 15.0.0_1.0.0 BSP源構建錯誤如何解決?

    : ~/imx-android-15/android_build$ lunch evk_8mp-trunk_staging-userdebug~/imx-android-15/androi
    發表于 04-11 07:16

    Android開發必看】使用JetBrains TeamCity為Android項目構建CI/CD管道詳細指南

    【CI/CD】定義明確的構建、測試和部署工作流對Android應用的開發至關重要。JetBrains TeamCity是一個用于構建可靠管道的CI/CD平臺,可與流行的Android開發
    的頭像 發表于 03-21 15:42 ?1196次閱讀
    【<b class='flag-5'>Android</b><b class='flag-5'>開發</b>者<b class='flag-5'>必看</b>】使用JetBrains TeamCity為<b class='flag-5'>Android</b>項目構建CI/CD管道詳細指南