91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

3天內不再提示

新手必看!Android Light HAL開發(fā)實戰(zhàn)(Rockchip 15 AIDL版)

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

掃碼添加小助手

加入工程師交流群

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

一、先搞懂:什么是Light HAL

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

1. HAL是什么?

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

2. Light HAL的作用?

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

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

?按鍵燈(BUTTONS)的開關;

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

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

3. AIDLHAL?

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

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

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

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

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

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

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

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

2.實現(xiàn)文件:Lights.cpp(填充血肉

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

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(虛擬文件系統(tǒng)),比如想調背光,本質就是往/sys/class/backlight/backlight/brightness文件里寫數(shù)字(0-255),這個函數(shù)就是給不同燈光找對應的文件路徑。

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;  }}

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

3setLightState:處理Framework的調用請求

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

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

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

int main() { //1. 初始化Binder線程池(AIDL通信的基礎) ABinderProcess_setThreadPoolMaxThreadCount(0); //2. 創(chuàng)建Lights實例(真正處理燈光邏輯的對象)  std::shared_ptr<Lights> lights = ndk::SharedRefBase::make(); //3. 把HAL服務注冊到系統(tǒng)的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就是開門營業(yè)的操作:

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

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

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

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

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

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

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

5.啟動配置:lights-rockchip.rc(系統(tǒng)啟動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類服務,系統(tǒng)啟動時會批量啟動;

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

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

Light HAL服務完整啟動流程圖

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

wKgZO2mneYWAMPDVAAD1p8N_j4E349.png

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

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

wKgZO2mneYWAepSVAALqUMV9buQ101.png

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

1.系統(tǒng)開機init進程掃描lights-rockchip.rc,啟動android.hardware.lights-service.rockchip可執(zhí)行文件;

2.啟動HAL服務:執(zhí)行main.cpp,創(chuàng)建Lights實例,注冊服務到ServiceManager,等待調用;

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

4.HAL處理請求setLightState根據(jù)燈光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實現(xiàn)硬件操作邏輯;

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

?rc/xml配置服務啟動和系統(tǒng)識別;

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

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

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

    關注

    12

    文章

    4026

    瀏覽量

    134026
  • Linux
    +關注

    關注

    88

    文章

    11763

    瀏覽量

    219083
  • Rockchip
    +關注

    關注

    0

    文章

    92

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    rk3576 android15平臺camera編譯配置都做了什么?

    該文件是瑞芯微(Rockchip)Android平臺下相機子系統(tǒng)的核心編譯配置Makefile,屬于Android Build System的關鍵組成部分,作用是根據(jù)編譯環(huán)境的動態(tài)條件(SDK版本
    的頭像 發(fā)表于 03-06 17:15 ?2935次閱讀
    rk3576 <b class='flag-5'>android15</b>平臺camera編譯配置都做了什么?

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

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

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

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

    硬核進階:RK3576 Android15?驅動與系統(tǒng)開發(fā)實戰(zhàn)指南

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

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

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

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

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

    實戰(zhàn)RK3568性能調優(yōu):如何利用迅為資料壓榨NPU潛能-在Android系統(tǒng)中使用NPU

    實戰(zhàn)RK3568性能調優(yōu):如何利用迅為資料壓榨NPU潛能-在Android系統(tǒng)中使用NPU》
    的頭像 發(fā)表于 11-07 13:42 ?672次閱讀
    <b class='flag-5'>實戰(zhàn)</b>RK3568性能調優(yōu):如何利用迅為資料壓榨NPU潛能-在<b class='flag-5'>Android</b>系統(tǒng)中使用NPU

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

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

    RNKK Android人體姿態(tài)識別開發(fā)指南

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

    谷歌全新Android助力提高開發(fā)效率

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

    itop-3588開發(fā)Android系統(tǒng)開發(fā)筆記-旋轉 Android系統(tǒng)

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

    HAL15xy_SOT23

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

    新手必看:動態(tài)住宅 IP 的核心原理與實戰(zhàn)指南

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

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

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

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

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