總結Android HAL層的使用方法
1、使用HAL的方法
下面以Sensor感測器為例介紹使用HAL的方法,具體流程如下所示。
step1. Native code通過 hw_get_module 呼叫 HAL stub。
- hw_get_module( LED_HARDWARE_MODULE_ID, (const hw_module_t**)&module)
step2. 通過繼承 hw_module_methods_t 的callback來開啟裝置。
-
module->methods->open(module, LED_HARDWARE_MODULE_ID, (struct hw_device_t**)device);
step3. 通過繼承 hw_device_t 的 callback(回撥函式)來控制裝置。
- sLedDevice->set_on( sLedDevice, led);
- sLedDevice->set_off( sLedDevice, led);
2、編寫 HAL stub 的方法
編寫 HAL stub 的基本流程如下所示。
step1. 自定義 HAL 結構體,編寫標頭檔案 led.h 和 hardware/hardware.h,主要程式碼如下所示。
- struct led_module_t {
-
struct hw_module_t common;
- };
- struct led_control_device_t {
- struct hw_device_t commom;
- int fd; // LED裝置檔案標碼
- // 支援控制的 API介面
- int (*set_on)(struct led_control_device_t *dev, int32_t led);
- int (*set_off)(struct led_control_device_t *dev, int32_t led);
- };
step2. 編寫檔案 led.c 實現 HAL stub 註冊功能。
step3. 設定 led_module_methods 繼承於hw_module_methods_t,並實現對 open() 方法的回撥。
- struct hw_module_methods_t led_module_methods = {
- open: led_device_open
- };
step4. 使用HAL_MODULE_INFO_SYM 例項化 led_module_t,注意各個名稱不可以修改。
- conststruct led_module_t HAL_MODULE_INFO_SYM = {
- common: {
- tag: HARDWARE_MODULE_TAG,
- version_major: 1,
- version_minor: 0,
- id: LED_HARDWARE_MODULE_ID,
- name: "Sample LED Stub",
- author: &led_module_methods,
- }
- };
補充說明:
tag :表示需要指定為 HARDWARE_MODULE_TAG.
id :表示指定為 HAL Stub 的 module ID。
methods :為 HAL 所定義的方法。
step5. open()是一個必須實現的回撥 API,用於負責申請結構體控制元件並填充資訊,並且可以註冊具體操作API介面,並開啟linux驅動。
但是因為存在多重繼承關係,所以只需對子結構體 hw_device_t 物件申請控制元件即可。
- int led_device_open(conststruct hw_module_t* module, constchar* name, struct hw_device_t** device)
- {
- struct led_control_device_t* dev;
- dev = (struct led_control_device_t *)malloc( sizeof(*dev) );
- memset(dev, 0, sizeof(*dev) );
- dev->common.tag = HARDWARE_DEVICE_TAG;
- dev->common.version = 0;
- dev->common.module = module;
- dev->common.close = led_device_close;
- dev->set_on = led_on;
- dev->set_off = led_off;
- *device = &dev->common;
- // initialize Led hardware here
- dev->fd = open(LED_DEVICE, O_RDONLY);
- if( dev->fd < 0 ) return -1;
- led_off(dev, LED_C608);
- led_off(dev, LED_C609);
- success:
- return 0;
- }
step6. 填充具體API操作,具體程式碼如下所示。
- int led_on(struct led_control_device_t* dev, int32_t led)
- {
- int fd;
- LOGI("LED Stub: set %d on.", led);
- fd = dev->fd;
- switch(fd)
- {
- case LED_C608:
- ioctl(fd, 1, &led);
- break;
- case LED_C609:
- ioctl(fd, 1, &led);
- break;
- default:
- return -1;
- }
- return 0;
- }
- int led_off(struct led_control_device_t* dev, int32_t led)
- {
- int fd;
- LOGI("LED Stub: set %d off.", led);
- fd = dev->fd;
- switch(fd)
- {
- case LED_C608:
- ioctl(fd, 2, &led);
- break;
- case LED_C609:
- ioctl(fd, 2, &led);
- break;
- default:
- return -1;
- }
- return 0;
- }
相關推薦
總結Android HAL層的使用方法
1、使用HAL的方法 下面以Sensor感測器為例介紹使用HAL的方法,具體流程如下所示。 step1. Native code通過 hw_get_module 呼叫 HAL stub。 hw_get_module( LED_HARDWARE_MODULE_I
android hal層 c 堆疊列印方法
比如要追蹤 hardware/qcom/audio/hal/audio_hw.c 中adev_set_mode() 函式的函式堆疊呼叫關係 實際原理就是利用c++ callstack 庫,重新編譯成c庫後使用即可. 1. 在hardware/qcom/audio/hal/
android HAL層自我總結
Android版本:2.3.7_r1 Linux核心版本:android-goldfish-2.6.29 參考文章:Android架構分析之使用自定義硬體抽象層(HAL)模組 http://blog.csdn.net/liuhaoyutz/article/details/91478
【轉】android hal 層GPS 研究總結——關於GPS GGA/GSV/RMC 資料的解析
快跑的未必能贏,力戰的未必獲勝,聰明的未必得糧食,明哲的未必得資財,靈活的未必得喜悅。所臨到世人的,是在乎當時的機會。 人生一世間,忽若暮春草。/Eclair/hardware/libhardware_legacy/include/hardware_legacy/gps.h typedef struct {
Android HAL層與Linux Kernel層驅動開發簡介
近日稍微對Android中的驅動開發做了一些簡要的瞭解,稍稍理清了一下Android驅動開發的套路,總結一下筆記。 HAL:Hardware Abstract Layer 硬體抽象層,由於Linux Kernel需要遵循GPL開源協議,硬體廠商為了保護自己
ch8.1 Android HAL層簡介
8.1 Android HAL層簡介 HAL(Hardware abstract Layer)硬體抽象層是google開發的android系統裡上層應用對底層硬體操作的一個遮蔽的軟體層次,通俗來講,就是上層的應用不用關心底層硬體如何工作,只要向上層提供一個統一的介面即可
Android HAL層hardware module的設計
Android為了遮蔽硬體的複雜性,設計了一個HAL層,HardwareAbstarct Layer,即硬體抽象層。HAL層位於驅動和framework之間,為各個硬體廠家提供的形形色色的驅動模組規定了統一的介面。在Android裡面,這些介面是用c語言描述的,而在c語言中
Butterknife--Android Butterknife使用方法總結(轉)
black inner 混淆 ora RoCE max 通過 要點 vat 原文鏈接:http://blog.csdn.net/donkor_/article/details/77879630 前言: ButterKnife是一個專註於Android系統的View註入框架,
Atitit 提升記憶效率 有失真壓縮原理總結 目錄 1. 常見方法 1 1.1. 抽象化提升一層 概念化 1 1.2. 骨架 ,目錄化 大綱化 歸納整理 1 1.3. 提取關鍵詞 ,摘要 ,
Atitit 提升記憶效率 有失真壓縮原理總結 目錄 1. 常見方法 1 1.1. 抽象化提升一層 概念化 1 1.2. 骨架 ,目錄化 大綱化 歸納整理 1 1.3. 提取關鍵詞 ,摘要 ,丟棄細節部分 1
Android開發之HAL層
本文摘自 羅昇陽的《Anroid系統原始碼情景分析》,更新至Android7.0分析 一、概念 一、Android系統為硬體抽象層中的模組介面定義了編寫規範,我們必須按照這個規範來編寫自己的硬體模組介面。 二、Android系統的硬體
一種定位android HAL程式碼位置的方法
一種定位android HAL程式碼位置的方法 2017年04月07日 23:33:20 feiniao8651 閱讀數:1044 背景 裝置廠商一般會在Android HAL層做自己定義的實現,但是不同廠商的路徑不同,在沒有文件的情況下,查詢對應的原始碼實現就要花費
Android Butterknife 使用方法總結
前言: ButterKnife是一個專注於Android系統的View注入框架,以前總是要寫很多findViewById來找到View物件,有了ButterKnife可以很輕鬆的省去這些步驟。是大神JakeWharton的力作,目前使用很廣。最重要的一點,使
Atitit 提升記憶效率 有失真壓縮原理總結 目錄 1. 常見方法 1 1.1. 抽象化提升一層 概念化 1 1.2. 骨架 ,目錄化 大綱化 歸納整理 1 1.3. 提取關鍵詞 ,摘要 ,
Atitit 提升記憶效率 有失真壓縮原理總結 目錄 常見方法 抽象化提升一層 概念化 骨架 ,目錄化 大綱化 歸納整理 如何目錄化,按照大綱來即可 提取關鍵詞 ,摘要 ,丟棄細節部分 通
Android O之HAL層開發
這裡介紹的是一種簡單HAL的寫法與呼叫。 我將會編寫一個app直接呼叫HAL的介面,而HAL層程式碼將直接讀寫驅動的節點。 簡介 Android O的一項新元素是 Project Treble。這是 Android 作業系統框架在架構方面的一項重大
途牛java面試總結(控制層裡可以過載方法嗎)
2018年12月19日上午10點,去途牛總部面試,本以為是一輪普通面試,到地方才發現,要先做一份筆試,筆試時間1小時。筆試題大都是java基礎,多執行緒之類,springmvc原理,sql等等,不是太難。做完之後,一面,根據你的簡歷問些java
android java層直接和kernel互動的最快的方法
http://blog.csdn.net/zengkexu/article/details/8805339 android java 和kernel 的互動方式 按照常規的要通過JNI實現, 然後jni 呼叫HAL的IOCTL ,或者類似Vold 中建立netli
Android AudioFlinger載入HAL層流程
一、前提 Audio HAL層最終以.so的方式為Android所用,那這個.so的庫如何被AudioFlinger所使用? 二、Audio Hardware HAL載入 (1)AudioFlinger AudioFlinger載入HAL層:
Android應用層到Framework到HAL再到驅動層的整個流程分析
本篇參考老羅的例項進行總結。老羅寫六篇,層層巢狀,他告訴了我們流程,但沒有說程式設計思想,所以,即使知道怎麼做也很快會忘調,因此打算總結下每層之間是怎麼呼叫的,以加深印象。不對細節進行探討。細節可以參見老羅的blog:http://blog.csdn.net/luoshen
s5p4418 Android 4.4.2 驅動層 HAL層 服務層 應用層 開發流程記錄(一 硬體驅動層)
歡迎轉載,務必註明出處:http://blog.csdn.net/wang_shuai_ww/article/details/44303069 本文章是記錄Android開發中驅動層、HAL層、應用層之間的關係,以及其開發方法,本文將會以實現LED的控制為例來進行記錄。 一
android SDK更新方法總結
今天更新SDK的總結 發生錯誤: 如下: 解決辦法: 1 首先更改 hosts 在hosts當中新增: 203.208.46.146 dl-ssl.google.com 這個ip 地址可以在網上多搜一搜 比較不知道什麼時候就被切掉了