日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式案例Show
[導(dǎo)讀]硬件抽象層介紹 + 硬件抽象層(Hardware Abstraction Layer,簡(jiǎn)稱HAL)是介于android內(nèi)核kernel和上層之間的抽象出來的一層結(jié)構(gòu),是對(duì)Linux驅(qū)動(dòng)的一個(gè)封裝,對(duì)上層提供統(tǒng)一接口,上層應(yīng)用不必知道下層硬件具體怎么工作的,屏蔽了底層的實(shí)現(xiàn)細(xì)節(jié)。為什么有了 硬


硬件抽象層介紹



+


硬件抽象層(Hardware Abstraction Layer,簡(jiǎn)稱HAL)是介于android內(nèi)核kernel和上層之間的抽象出來的一層結(jié)構(gòu),是對(duì)Linux驅(qū)動(dòng)的一個(gè)封裝,對(duì)上層提供統(tǒng)一接口,上層應(yīng)用不必知道下層硬件具體怎么工作的,屏蔽了底層的實(shí)現(xiàn)細(xì)節(jié)。為什么有了 硬件抽象層有其存在的意義:

1)不是所有的硬件設(shè)備都有標(biāo)準(zhǔn)的Linux內(nèi)核接口,通過HAL層封裝了一套固定的向上接口,可以使得上層的開發(fā)邏輯更清晰簡(jiǎn)單。HAL框架是固定的,開發(fā)人員只需要按照框架開發(fā)即可,無需關(guān)注與上層的交互上,將精力放在HAL層本身的實(shí)現(xiàn)上即可。

2)從商業(yè)角度,硬件廠商可以把一些核心的算法、調(diào)試參數(shù)、實(shí)現(xiàn)邏輯等放在HAL層而不是kenel層,kenel層只是簡(jiǎn)單與硬件做數(shù)據(jù)交互。這樣的好處是可以不用遵Linux的GPL開源協(xié)議,保護(hù)自身的商業(yè)機(jī)密。

Hal架構(gòu)圖


模塊類型結(jié)構(gòu)體hw_module_t,設(shè)備類型結(jié)構(gòu)體hw_device_t,

兩個(gè)結(jié)構(gòu)體的詳細(xì)內(nèi)容可以參考源碼路徑:/hardware/libhardware/include/hardware/hardware.h。HAL層開發(fā)主要工作是建立好自定義的結(jié)構(gòu)體,并實(shí)現(xiàn)hw_device_t的內(nèi)部的幾個(gè)關(guān)鍵函數(shù)。


  1. 頭文件hardware/libhardware/include/hardware/testled_hal.h

#ifndef _LED_HAL_H_#define _LED_HAL_H_

#include <hardware/hardware.h>

#define LED_HAL_MODULE_ID "testled_hal"

struct testled_module_t { struct hw_module_t common;};

struct testled_device_t {struct hw_device_t common; int (*open)(void); int (*control)(int on);};

#endif

頭文件內(nèi)申明了led的兩個(gè)關(guān)鍵結(jié)構(gòu)體testled_module_t和testled_device_t,結(jié)構(gòu)體的實(shí)現(xiàn)在c文件中。


2)c文件 hardware/libhardware/modules/testled/testled_hal.c


#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <string.h>#include <errno.h>#include <hardware/testled_hal.h>#include <linux/ioctl.h>


//日志的標(biāo)簽

#define LOG_TAG "testled_hal"#include <utils/Log.h>



#define LEDCTRL_MAGIC 'k'#define LED1CTRL_ON_CMD _IO (LEDCTRL_MAGIC, 1)#define LED1CTRL_OFF_CMD _IO (LEDCTRL_MAGIC, 2)#define LED2CTRL_ON_CMD _IO (LEDCTRL_MAGIC, 3)#define LED2CTRL_OFF_CMD _IO (LEDCTRL_MAGIC, 4)

static int fd;

int testled_hal_dev_close(struct hw_device_t *device){ if(device != NULL) { struct testled_device_t *temp = (struct testled_device_t *)device; free(temp); }

close(fd);

return 0;}

int testled_hal_open_dev(void){ ALOGD("--%s--", __func__);

fd = open("/dev/test-led", O_RDWR); if(fd < 0) { ALOGE("open failed : %s", strerror(errno)); return fd; }

return 0;}

int testled_hal_control_dev(int on){ ALOGD("--%s--", __func__);

int ret;



switch(on){ case 0: ret = ioctl(fd, LED1CTRL_ON_CMD,0); break; case 1: ret = ioctl(fd, LED1CTRL_OFF_CMD,0); break; case 2: ret = ioctl(fd, LED2CTRL_ON_CMD,0); break; case 3: ret = ioctl(fd, LED2CTRL_OFF_CMD,0); break; default: break;

}


if(ret < 0){ ALOGE("control failed : %s", strerror(errno)); return ret; }

return 0;}

int testled_hal_module_open(const struct hw_module_t *module, const char *id, struct hw_device_t **device){ ALOGD("--%s--", __func__);

struct testled_device_t *led_dev = NULL;

led_dev = (struct testled_device_t *)malloc(sizeof(struct testled_device_t)); if (led_dev == NULL)     { ALOGE("malloc failed"); return -1; }

ALOGD("malloc success");

//初始化device對(duì)象 led_dev->common.tag = HARDWARE_DEVICE_TAG; led_dev->common.version = 1; led_dev->common.module = module; led_dev->common.close = testled_hal_dev_close;

led_dev->open = testled_hal_open_dev; led_dev->control = testled_hal_control_dev;


//將當(dāng)前的led_dev傳遞給jni層

 *device = (struct hw_device_t *)led_dev;

return 0; }

struct testled_device_t testled_hal_methods = { open : testled_hal_module_open, };

struct testled_module_t HAL_MODULE_INFO_SYM = { common : { tag : HARDWARE_MODULE_TAG, version_major : 1, version_minor : 0, id : LED_HAL_MODULE_ID, name : "testled hal module", methods : &testled_hal_methods, },};

主要實(shí)現(xiàn)了hal結(jié)構(gòu)體中的close,open,control函數(shù),并將函數(shù)傳給結(jié)led_dev構(gòu)體。

led_dev->common.close = testled_hal_dev_close;

led_dev->open = testled_hal_open_dev;led_dev->control = testled_hal_control_dev;



  1. Android.mk hardware/libhardware/modules/testled/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := testled_hal.defaultLOCAL_MODULE_RELATIVE_PATH := hwLOCAL_SRC_FILES := testled_hal.cLOCAL_SHARED_LIBRARIES := liblog libcutilsLOCAL_MODULE_TAGS := optional

include $(BUILD_SHARED_LIBRARY)


將c文件編譯成模塊


  1. hardware/libhardware/modules/Android.mk內(nèi)加入testled



三、編譯

模塊編譯

mmm hardware/libhardware/modules/ testled

在out/target/product/nanopc-t4/system/lib/hw/ 目錄下生生成test_led_hal.default.so

全部編譯后,test_led_hal.default.so在設(shè)備的/system/lib/hw路徑下,android frameworks中的JNI調(diào)用led設(shè)備時(shí),通過一系列轉(zhuǎn)換就會(huì)調(diào)用到這個(gè)庫內(nèi)部的函數(shù),從而調(diào)動(dòng)掉底層的led驅(qū)動(dòng)。


掃碼關(guān)注我們

看更多嵌入式案例



喜歡本篇內(nèi)容請(qǐng)給我們點(diǎn)個(gè)再看

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀

廈門2026年3月27日 /美通社/ -- 當(dāng)前,全球Mini/Micro LED產(chǎn)業(yè)正邁入產(chǎn)業(yè)化爆發(fā)的黃金周期,新型顯示技術(shù)加速重構(gòu)全球產(chǎn)業(yè)格局、重塑行業(yè)競(jìng)爭(zhēng)秩序。三安光電湖北有限公司作為公司布局Mini/M...

關(guān)鍵字: LED MICRO 三安光電 NI

這款節(jié)省空間的器件在 5 mA電流下可提供高達(dá) 252 mcd 的發(fā)光強(qiáng)度, 能夠呈現(xiàn)CIE 1931色域內(nèi)色域三角形中的每一種顏色

關(guān)鍵字: 芯片 RGB LED

中國 上海,2026年3月25日——照明與傳感創(chuàng)新的全球領(lǐng)導(dǎo)者艾邁斯歐司朗(SIX:AMS)今日亮相2026第二十一屆汽車燈具產(chǎn)業(yè)發(fā)展技術(shù)論壇暨上海國際汽車燈具展覽會(huì)(ALE)。本屆ALE以“光馭未來:智能、綠色與安全的...

關(guān)鍵字: 智能前照燈 LED

March 4, 2026 ---- 根據(jù)TrendForce集邦咨詢最新調(diào)查,隨著生成式AI興起,數(shù)據(jù)中心對(duì)高速傳輸?shù)男枨蟪掷m(xù)提升,原先應(yīng)用在機(jī)柜內(nèi)(Intra-Rack)短距傳輸?shù)你~纜方案,將在傳輸密度與節(jié)能上面臨嚴(yán)...

關(guān)鍵字: 數(shù)據(jù)中心 生成式AI LED

奧地利Premst?tten /德國慕尼黑(2026年2月24日)——艾邁斯歐司朗(SIX: AMS)與深圳市美志光電技術(shù)有限公司(以下簡(jiǎn)稱“美志光電”)就其在美國與德國市場(chǎng)未決的LED專利糾紛達(dá)成和解。

關(guān)鍵字: LED 發(fā)射器

Feb. 24, 2026 ---- 根據(jù)TrendForce集邦咨詢最新UV LED市場(chǎng)趨勢(shì)與產(chǎn)品分析,由于貴金屬、原物料與人工費(fèi)用調(diào)漲,2026年第一季UV LED價(jià)格獲得支撐,客制化產(chǎn)品甚至有機(jī)會(huì)季增5%。在全球光...

關(guān)鍵字: LED 太陽光源模擬器

光耦合器對(duì)開關(guān)電源(SMPS)設(shè)計(jì)至關(guān)重要,它使得信號(hào)能夠安全、可靠地跨越電氣隔離邊界傳輸。而光耦合器的性能取決于適當(dāng)?shù)钠眉霸诜答伩刂骗h(huán)路內(nèi)的正確集成;配置錯(cuò)誤會(huì)導(dǎo)致不穩(wěn)定、瞬態(tài)響應(yīng)不佳和調(diào)節(jié)性能下降。本文分為兩部分,...

關(guān)鍵字: 光耦合器 開關(guān)電源 LED

隨著汽車向移動(dòng)智能終端演進(jìn),車內(nèi)座艙體驗(yàn)成為競(jìng)爭(zhēng)焦點(diǎn)。動(dòng)態(tài)流水氛圍燈作為提升科技感與個(gè)性化體驗(yàn)的關(guān)鍵配置,正從中高端車型快速滲透至更廣泛的車型市場(chǎng)。在這一趨勢(shì)下,如何在強(qiáng)化視覺交互的同時(shí)控制成本,成為產(chǎn)業(yè)鏈共同面對(duì)的核心...

關(guān)鍵字: 動(dòng)態(tài)氛圍燈 驅(qū)動(dòng)芯片 LED

這個(gè)項(xiàng)目是為我物理計(jì)算課程中的數(shù)據(jù)可視化項(xiàng)目而設(shè)計(jì)的。其核心理念是通過 LED 燈帶來展示飛機(jī)在天空中的位置,每盞 LED 燈都代表著一個(gè)位置。這些燈光會(huì)隨著飛機(jī)的活動(dòng)而移動(dòng)并改變顏色。

關(guān)鍵字: LED REST API 樹莓派 繼電器

該項(xiàng)目展示了在基于 FreeRTOS 的系統(tǒng)(運(yùn)行于 Arduino Uno 上)中實(shí)現(xiàn)安全的數(shù)據(jù)共享訪問的實(shí)現(xiàn)方式。

關(guān)鍵字: LED ADC 數(shù)據(jù) Arduino
關(guān)閉