1.新建hardware/libhardware/include/hardware/led_hal.h檔案:
2.新建hardware/libhardware/modules/led/led_hal.c檔案:#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
3.新建hardware/libhardware/modules/led/android.mk:#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 =
};
編譯:mmm hardware/libhardware/modules/led/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
在out/target/product/msm8909/system/lib/hw/下會生成led.default.so檔案。
4.新建frameworks/base/services/core/jni/com_android_server_ledservice.cpp檔案:
5.修改frameworks/base/services/core/jni/onload.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)
};
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...