1:aosp/hardware/libhardware/include/hardware/hello.hapi
#ifndef ANDROID_HELLO_INTERFACE_H #define ANDROID_HELLO_INTERFACE_H #include <hardware/hardware.h> __BEGIN_DECLS #define HELLO_HARDWARE_MODULE_ID "hello"//ID struct hello_module_t { struct hw_module_t common; };//hw_module_t的繼承者 struct hello_device_t { struct hw_device_t common; int fd; int (*set_val)(struct hello_device_t* dev, int val); int (*get_val)(struct hello_device_t* dev, int* val); };//hw_device_t的繼承者 __END_DECLS #endif
2:aosp/hardware/libhardware/modules/hello/hello.catom
#define LOG_TAG "HelloStub" #include <hardware/hardware.h> #include <hardware/hello.h> #include <sys/mman.h> #include <dlfcn.h> #include <cutils/ashmem.h> #include <cutils/log.h> #include <fcntl.h> #include <errno.h> #include <sys/ioctl.h> #include <string.h> #include <stdlib.h> #include <cutils/log.h> #include <cutils/atomic.h> #define MODULE_NAME "Hello" char const * const device_name = "/dev/hello" ; static int hello_device_open(const struct hw_module_t* module, const char* name, struct hw_device_t** device); static int hello_device_close(struct hw_device_t* device); static int hello_set_val(struct hello_device_t* dev, int val); static int hello_get_val(struct hello_device_t* dev, int* val); static struct hw_module_methods_t hello_module_methods = { .open = hello_device_open, }; static int hello_device_open(const struct hw_module_t* module, const char* name, struct hw_device_t** device) { struct hello_device_t* dev; char name_[64]; //pthread_mutex_t lock; dev = (struct hello_device_t*)malloc(sizeof(struct hello_device_t)); if(!dev) { ALOGE("Hello Stub: failed to alloc space"); return -EFAULT; } ALOGE("Hello Stub: hello_device_open eliot_shao"); memset(dev, 0, sizeof(struct hello_device_t)); dev->common.tag = HARDWARE_DEVICE_TAG; dev->common.version = 0; dev->common.module = (hw_module_t*)module; dev->common.close = hello_device_close; dev->set_val = hello_set_val; dev->get_val = hello_get_val; //pthread_mutex_lock(&lock); dev->fd = -1 ; snprintf(name_, 64, device_name, 0); dev->fd = open(name_, O_RDWR); if(dev->fd == -1) { ALOGE("Hello Stub:eliot failed to open %s !-- %s.", name_,strerror(errno)); free(dev); return -EFAULT; } //pthread_mutex_unlock(&lock); *device = &(dev->common); ALOGI("Hello Stub: open HAL hello successfully."); return 0; } static int hello_device_close(struct hw_device_t* device) { struct hello_device_t* hello_device = (struct hello_device_t*)device; if(hello_device) { close(hello_device->fd); free(hello_device); } return 0; } static int hello_set_val(struct hello_device_t* dev, int val) { ALOGI("Hello Stub: set value to device."); write(dev->fd, &val, sizeof(val)); return 0; } static int hello_get_val(struct hello_device_t* dev, int* val) { if(!val) { ALOGE("Hello Stub: error val pointer"); return -EFAULT; } read(dev->fd, val, sizeof(*val)); ALOGI("Hello Stub: get value from device"); return 0; } struct hello_module_t HAL_MODULE_INFO_SYM = { .common = { .tag = HARDWARE_MODULE_TAG, //.module_api_version = FINGERPRINT_MODULE_API_VERSION_2_0, .hal_api_version = HARDWARE_HAL_API_VERSION, .id = HELLO_HARDWARE_MODULE_ID, .name = "Demo shaomingliang hello HAL", .author = "The Android Open Source Project", .methods = &hello_module_methods, }, };