日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

一、先搞懂:什么是Light HAL

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

1. HAL是什么?

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

2. Light HAL的作用?

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

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

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

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

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

3. AIDLHAL?

Android 10+后,HAL逐漸從舊的HIDL遷移到AIDLAndroid接口定義語(yǔ)言),核心是用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(多屏場(chǎng)景用) charbacklight_path[128];// 背光驅(qū)動(dòng)的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); // 存儲(chǔ)支持的燈光列表  std::vector _lights; // 存儲(chǔ)多屏背光的路徑(瑞芯微多屏方案的核心)  std::vector _backlights;};

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

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

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

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

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

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

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

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

2write_int:往驅(qū)動(dòng)文件寫(xiě)值(操作硬件)

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

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

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

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

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

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

int main() { //1. 初始化Binder線程池(AIDL通信的基礎(chǔ)) ABinderProcess_setThreadPoolMaxThreadCount(0); //2. 創(chuàng)建Lights實(shí)例(真正處理燈光邏輯的對(duì)象)  std::shared_ptr<Lights> lights = ndk::SharedRefBase::make(); //3. 把HAL服務(wù)注冊(cè)到系統(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ù)的啟動(dòng)入口,就像你開(kāi)餐館,main.cpp就是開(kāi)門(mén)營(yíng)業(yè)的操作:

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

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

?告訴顧客(Framework我在這營(yíng)業(yè)(注冊(cè)服務(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)看的說(shuō)明書(shū),告訴Android系統(tǒng):我是Light HAL服務(wù),版本是2,接口名是ILights/default”,系統(tǒng)會(huì)通過(guò)這個(gè)文件校驗(yàn)HAL的兼容性,確保Framework能正確調(diào)用。

5.啟動(dòng)配置:lights-rockchip.rc(系統(tǒng)啟動(dòng)HAL

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

新手理解Android開(kāi)機(jī)后,init進(jìn)程會(huì)掃描這個(gè)文件,然后自動(dòng)啟動(dòng)Light HAL服務(wù):

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

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

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

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

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

wKgZO2mneYWAMPDVAAD1p8N_j4E349.png

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

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

wKgZO2mneYWAepSVAALqUMV9buQ101.png

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

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

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

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

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

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

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

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

四、避坑指南

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

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

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

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

五、總結(jié)

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

?Lights.h定義接口骨架;

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

?main.cpp啟動(dòng)并注冊(cè)HAL服務(wù);

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

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

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

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

    關(guān)注

    12

    文章

    4035

    瀏覽量

    134548
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11821

    瀏覽量

    219598
  • Rockchip
    +關(guān)注

    關(guān)注

    0

    文章

    93

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    rk3576 android15平臺(tái)camera編譯配置都做了什么?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    【RK3568 NPU實(shí)戰(zhàn)】別再閑置你的NPU!手把手帶你用迅為資料跑通Android AI檢測(cè)Demo,附完整流程與效果
    的頭像 發(fā)表于 11-10 15:58 ?1261次閱讀
    【RK3568 NPU<b class='flag-5'>實(shí)戰(zhàn)</b>】別再閑置你的NPU!手把手帶你用迅為資料跑通<b class='flag-5'>Android</b> AI檢測(cè)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 ?1132次閱讀
    <b class='flag-5'>實(shí)戰(zhàn)</b>RK3568性能調(diào)優(yōu):如何利用迅為資料壓榨NPU潛能-在<b class='flag-5'>Android</b>系統(tǒng)中使用NPU

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

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

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

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

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

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

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

    屏幕旋轉(zhuǎn)包括倆個(gè)部分:Android 顯示旋轉(zhuǎn)和 Recovery 顯示旋轉(zhuǎn)在開(kāi)發(fā)的過(guò)程中,我們使用的屏幕可能是物理橫屏或者物理豎屏,如果我們想要物理橫屏 顯示為豎屏,物理豎屏顯示為橫屏?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次下載
    沽源县| 博野县| 龙胜| 镇巴县| 望奎县| 锡林浩特市| 梅州市| 阳原县| 蛟河市| 永寿县| 唐河县| 阆中市| 米易县| 平安县| 福贡县| 文安县| 郧西县| 东安县| 丹江口市| 陵川县| 台南县| 呼图壁县| 五指山市| 铜陵市| 泸西县| 乌兰浩特市| 阿坝| 龙南县| 大埔县| 和硕县| 项城市| 化隆| 通辽市| 乌拉特中旗| 安泽县| 铜鼓县| 云南省| 万年县| 田阳县| 临武县| 湟中县|