1. 程式人生 > >總結Android HAL層的使用方法

總結Android HAL層的使用方法

1、使用HAL的方法

下面以Sensor感測器為例介紹使用HAL的方法,具體流程如下所示。

step1. Native code通過 hw_get_module 呼叫 HAL stub。

  1. hw_get_module( LED_HARDWARE_MODULE_ID, (const hw_module_t**)&module)  


step2. 通過繼承 hw_module_methods_t 的callback來開啟裝置。

  1. module->methods->open(module, LED_HARDWARE_MODULE_ID, (struct hw_device_t**)device);  


step3. 通過繼承 hw_device_t 的 callback(回撥函式)來控制裝置。

  1. sLedDevice->set_on( sLedDevice, led);  
  2. sLedDevice->set_off( sLedDevice, led);  

2、編寫 HAL stub 的方法

編寫 HAL stub 的基本流程如下所示。

step1. 自定義 HAL 結構體,編寫標頭檔案 led.h 和 hardware/hardware.h,主要程式碼如下所示。

  1. struct led_module_t {  
  2.     struct hw_module_t common;  
  3. };  
  4. struct led_control_device_t {  
  5.     struct hw_device_t commom;  
  6.     int fd;     // LED裝置檔案標碼
  7.     // 支援控制的 API介面
  8.     int (*set_on)(struct led_control_device_t *dev, int32_t led);  
  9.     int (*set_off)(struct led_control_device_t *dev, int32_t led);  
  10. };  

step2. 編寫檔案 led.c 實現 HAL stub 註冊功能。

step3. 設定 led_module_methods 繼承於hw_module_methods_t,並實現對 open() 方法的回撥。

  1. struct hw_module_methods_t led_module_methods = {  
  2.     open: led_device_open  
  3. };  


step4. 使用HAL_MODULE_INFO_SYM 例項化 led_module_t,注意各個名稱不可以修改。

  1. conststruct led_module_t HAL_MODULE_INFO_SYM = {  
  2.     common: {  
  3.         tag: HARDWARE_MODULE_TAG,  
  4.         version_major: 1,  
  5.         version_minor: 0,  
  6.         id: LED_HARDWARE_MODULE_ID,  
  7.         name: "Sample LED Stub",  
  8.         author: &led_module_methods,  
  9.     }  
  10. };  

補充說明:

tag :表示需要指定為 HARDWARE_MODULE_TAG.

id :表示指定為 HAL Stub 的 module ID。

methods :為 HAL 所定義的方法。


step5. open()是一個必須實現的回撥 API,用於負責申請結構體控制元件並填充資訊,並且可以註冊具體操作API介面,並開啟linux驅動。
但是因為存在多重繼承關係,所以只需對子結構體 hw_device_t 物件申請控制元件即可。

  1. int led_device_open(conststruct hw_module_t* module, constchar* name, struct hw_device_t** device)  
  2. {  
  3.     struct led_control_device_t* dev;  
  4.     dev = (struct led_control_device_t *)malloc( sizeof(*dev) );  
  5.     memset(dev, 0, sizeof(*dev) );  
  6.     dev->common.tag = HARDWARE_DEVICE_TAG;  
  7.     dev->common.version = 0;  
  8.     dev->common.module = module;  
  9.     dev->common.close = led_device_close;  
  10.     dev->set_on = led_on;  
  11.     dev->set_off = led_off;  
  12.     *device = &dev->common;  
  13.     // initialize Led hardware here
  14.     dev->fd = open(LED_DEVICE, O_RDONLY);  
  15.     if( dev->fd < 0 ) return -1;  
  16.     led_off(dev, LED_C608);  
  17.     led_off(dev, LED_C609);  
  18. success:  
  19.     return 0;  
  20. }  

step6. 填充具體API操作,具體程式碼如下所示。

  1. int led_on(struct led_control_device_t* dev, int32_t led)  
  2. {  
  3.     int fd;  
  4.     LOGI("LED Stub: set %d on.", led);  
  5.     fd = dev->fd;  
  6.     switch(fd)  
  7.     {  
  8.         case LED_C608:  
  9.             ioctl(fd, 1, &led);  
  10.             break;  
  11.         case LED_C609:  
  12.             ioctl(fd, 1, &led);  
  13.             break;  
  14.         default:  
  15.             return -1;  
  16.     }  
  17.     return 0;  
  18. }  
  19. int led_off(struct led_control_device_t* dev, int32_t led)  
  20. {  
  21.     int fd;  
  22.     LOGI("LED Stub: set %d off.", led);  
  23.     fd = dev->fd;  
  24.     switch(fd)  
  25.     {  
  26.         case LED_C608:  
  27.             ioctl(fd, 2, &led);  
  28.             break;  
  29.         case LED_C609:  
  30.             ioctl(fd, 2, &led);  
  31.             break;  
  32.         default:  
  33.             return -1;  
  34.     }  
  35.     return 0;  
  36. }  

相關推薦

總結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 HALhardware 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  地址可以在網上多搜一搜 比較不知道什麼時候就被切掉了