chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

一、先搞懂:什么是Light HAL

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

1. HAL是什么?

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

2. Light HAL的作用?

專門負(fù)責(zé)燈光類硬件的控制,比如:

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

?按鍵燈(BUTTONS)的開關(guān);

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

?電池?zé)簦?/span>BATTERY)的顏色/閃爍控制。

3. AIDLHAL?

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

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

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

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

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

新手理解:這個(gè)文件就像設(shè)計(jì)圖,定義了兩個(gè)核心:

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

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

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

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

1getDriverPath:定義燈光的驅(qū)動路徑

constchar*getDriverPath(LightType type){ switch(type) {   caseLightType:     return"/sys/class/backlight/backlight/brightness";// 背光驅(qū)動路徑   caseLightType:     return"/sys/class/leds/button-backlight/brightness";// 按鍵燈路徑   // 通知燈/電池?zé)舻戎赶?a  target="_blank">LED驅(qū)動目錄   caseLightType:   caseLightType:     return"/sys/class/leds";   default:     return"/not_supported";  }}

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

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

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

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

3setLightState:處理Framework的調(diào)用請求

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

新手理解Framework層調(diào)用Light HAL時(shí),直接調(diào)用這個(gè)函數(shù),它是上層請求底層操作的中轉(zhuǎn)站。

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

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

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

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

?準(zhǔn)備好廚師(Lights實(shí)例);

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

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

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

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

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

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開機(jī)后,init進(jìn)程會掃描這個(gè)文件,然后自動啟動Light HAL服務(wù):

?class hal:屬于HAL類服務(wù),系統(tǒng)啟動時(shí)會批量啟動;

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

?shutdown critical:關(guān)鍵服務(wù),崩潰會重啟,關(guān)機(jī)要等它退出。

Light HAL服務(wù)完整啟動流程圖

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

wKgZO2mneYWAMPDVAAD1p8N_j4E349.png

三、整體運(yùn)行流程:從調(diào)亮度硬件響應(yīng)

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

wKgZO2mneYWAepSVAALqUMV9buQ101.png

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

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

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

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

4.HAL處理請求setLightState根據(jù)燈光id找到背光驅(qū)動路徑;

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

6.驅(qū)動響應(yīng):內(nèi)核驅(qū)動收到文件寫入操作,控制屏幕背光硬件調(diào)亮度;

7.返回結(jié)果HAL把操作結(jié)果返回給Framework,整個(gè)流程結(jié)束。

四、避坑指南

1.路徑錯誤:驅(qū)動路徑寫錯(比如多屏場景背光路徑不對),會導(dǎo)致調(diào)亮度沒反應(yīng),重點(diǎn)查getDriverPathdisplay_settings.xml;

2.權(quán)限問題HAL服務(wù)運(yùn)行用戶不是system,會導(dǎo)致打不開驅(qū)動文件,查lights-rockchip.rcuser/group;

3.接口兼容lights-rockchip.xml的版本和接口名不對,Framework找不到服務(wù),重點(diǎn)核對name/version/fqname

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

五、總結(jié)

Rockchip Light HAL的核心邏輯其實(shí)很簡單:

?Lights.h定義接口骨架;

?Lights.cpp實(shí)現(xiàn)硬件操作邏輯;

?main.cpp啟動并注冊HAL服務(wù);

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

?本質(zhì)是Framework的請求轉(zhuǎn)成往sysfs文件寫值。

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

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

    關(guān)注

    12

    文章

    4035

    瀏覽量

    134526
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11821

    瀏覽量

    219592
  • Rockchip
    +關(guān)注

    關(guān)注

    0

    文章

    93

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

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

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

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

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

    深入解析Rockchip SFC驅(qū)動:SPI Flash傳輸流程與問題排查指南

    Controller)驅(qū)動 (spi-rockchip-sfc.c),用于高效管理SPI Flash的讀寫傳輸。本文基于Linux內(nèi)核驅(qū)動代碼與Rockchip官方開發(fā)指南,深入拆解SFC驅(qū)動的核心流程
    的頭像 發(fā)表于 02-04 07:13 ?839次閱讀
    深入解析<b class='flag-5'>Rockchip</b> SFC驅(qū)動:SPI Flash傳輸流程與問題排查指南

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

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

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

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

    C#上位機(jī)實(shí)戰(zhàn)開發(fā)指南

    電子發(fā)燒友網(wǎng)站提供《C#上位機(jī)實(shí)戰(zhàn)開發(fā)指南.pdf》資料免費(fèi)下載
    發(fā)表于 01-11 17:15 ?6次下載

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    HAL15xy_SOT23

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