Android使用HAL操作硬體

2021-07-26 14:02:14 字數 3276 閱讀 9397

1.新建hardware/libhardware/include/hardware/led_hal.h檔案:

#ifndef android_led_inte***ce_h

#define android_led_inte***ce_h

#include #include #include #include #define led_hardware_module_id "led"

struct led_module_t ;

struct led_device_t ;

#endif  // android_led_inte***ce_h

2.新建hardware/libhardware/modules/led/led_hal.c檔案:

#define log_tag "led_device"

#include #include #include #include #include #include #include int led_ctrl (struct led_device_t *dev, int val)

return 0;

}int close_led (struct hw_device_t *dev)

static int open_led (const struct hw_module_t *module, char const *name,

struct hw_device_t **device)

dev = malloc(sizeof(struct led_device_t));

if (!dev)

memset(dev, 0, sizeof(*dev));

dev->fd = fd;

dev->common.tag = hardware_device_tag;

dev->common.version = 0;

dev->common.module = (struct hw_module_t*)module;

dev->common.close = (int (*)(struct hw_device_t*))close_led;

dev->led_ctrl = led_ctrl;

*device = (struct hw_device_t *)dev;

return 0;

}static struct hw_module_methods_t led_module_methods = ;

struct led_module_t hal_module_info_sym =

};

3.新建hardware/libhardware/modules/led/android.mk:

local_path := $(call my-dir)

include $(clear_vars)

local_module := led.default

local_module_relative_path := hw

local_c_includes := hardware/libhardware

local_src_files := led_hal.c

local_shared_libraries := liblog

local_module_tags := userdebug

編譯:mmm hardware/libhardware/modules/led/

在out/target/product/msm8909/system/lib/hw/下會生成led.default.so檔案。

4.新建frameworks/base/services/core/jni/com_android_server_ledservice.cpp檔案:

#define log_tag "ledservicejni"

#include "utils/log.h"

#include "jni.h"

#include "jnihelp.h"

#include "android_runtime/androidruntime.h"

#include #include #include #include #include namespace android

ret = led_module->common.methods->open((const struct hw_module_t *)led_module,

null, (struct hw_device_t **)&led_dev);

if (ret)

return 0;

}int led_ctrl(jnienv *env, jclass clazz, jint val)

return 0;

}void led_close(jnienv *env, jclass clazz)

static const jninativemethod method_table = ,,,

};int register_android_server_ledservice(jnienv *env)

};

5.修改frameworks/base/services/core/jni/onload.cpp檔案,增加函式宣告和呼叫:

int register_android_server_watchdog(jnienv* env);

int register_android_server_ledservice(jnienv *env);

register_android_server_watchdog(env);

register_android_server_ledservice(env);

6.修改frameworks/base/services/core/jni/android.mk檔案,增加一行:

$(local_rel_dir)/com_android_server_persistentdatablockservice.cpp \

$(local_rel_dir)/com_android_server_ledservice.cpp \

$(local_rel_dir)/onload.cpp

編譯:mmm frameworks/base/services

在out/target/product/msm8909/system/lib/下會生成libandroid_servers.so檔案。

Android 硬體抽象層(HAL)

出發點 保護廠商利益 android的硬體抽象層,簡單來說,就是 對linux核心驅動程式的封裝,向上提供介面,遮蔽低層的實現細節。也就是說,把對硬體的支援分成了兩層,一層放在使用者空間 user space 一層放在核心空間 kernel space 其中,硬體抽象層執行在使用者空間,而linux...

HAL驅動庫學習 如何使用HAL庫

二 具體使用過程 1 hal 硬體抽象層 初始化 2hal io 操作流程 hal functions 與內部資料處理類似傳送 接收,讀 寫.提供三種處理模型 apolling mode 查詢模式,hal函式在資料處理完成 阻塞 後返回處理狀態 ok or err 可以通過 hal ppp gets...

Android4 0之顯示部分HAL

一 原理分析 android中顯示屏裝置被抽象成乙個幀緩衝區 linux核心建立的 dev graphics fb0 裝置 就是用來描述系統中的乙個幀緩衝區 也就是乙個顯示屏 android系統grallochal模組封裝了對幀緩衝區的所有訪問操作。grallochal模組包含兩個裝置alloc和f...