编译HAL层生成lib.so文件

来源:互联网 发布:淘宝可以找人代付吗 编辑:程序博客网 时间:2024/05/29 12:46

本文以编译LCD背光的库文件为例,生成的库文件为 lights.mini6410.so.

源文件的目录为:Android-2.3.4/device/samsung/crespo/liblight/    light.c   Android.mk

light.c

/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */#define LOG_TAG "lights"#include <cutils/log.h>#include <stdint.h>#include <string.h>#include <errno.h>#include <fcntl.h>#include <pthread.h>#include <sys/ioctl.h>#include <sys/types.h>#include <hardware/lights.h>static pthread_once_t g_init = PTHREAD_ONCE_INIT;static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER;char const *const LCD_FILE = "/sys/class/backlight/pwm-backlight.0/brightness";static int write_int(char const *path, int value){int fd;static int already_warned;already_warned = 0;LOGV("write_int: path %s, value %d", path, value);fd = open(path, O_RDWR);if (fd >= 0) {char buffer[20];int bytes = sprintf(buffer, "%d\n", value);int amt = write(fd, buffer, bytes);close(fd);return amt == -1 ? -errno : 0;} else {if (already_warned == 0) {LOGE("write_int failed to open %s\n", path);already_warned = 1;}return -errno;}}static int rgb_to_brightness(struct light_state_t const *state){int color = state->color & 0x00ffffff;return ((77*((color>>16) & 0x00ff))+ (150*((color>>8) & 0x00ff)) + (29*(color & 0x00ff))) >> 8;}static int set_light_backlight(struct light_device_t *dev,struct light_state_t const *state){int err = 0;int brightness = rgb_to_brightness(state);pthread_mutex_lock(&g_lock);err = write_int(LCD_FILE, brightness);pthread_mutex_unlock(&g_lock);return err;}static int close_lights(struct light_device_t *dev){LOGV("close_light is called");if (dev)free(dev);return 0;}static int open_lights(const struct hw_module_t *module, char const *name,struct hw_device_t **device){int (*set_light)(struct light_device_t *dev,struct light_state_t const *state);LOGV("open_lights: open with %s", name);if (0 == strcmp(LIGHT_ID_BACKLIGHT, name))set_light = set_light_backlight;elsereturn -EINVAL;pthread_mutex_init(&g_lock, NULL);struct light_device_t *dev = malloc(sizeof(struct light_device_t));memset(dev, 0, sizeof(*dev));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_lights;dev->set_light = set_light;*device = (struct hw_device_t *)dev;return 0;}static struct hw_module_methods_t lights_module_methods = {.open =  open_lights,};const struct hw_module_t HAL_MODULE_INFO_SYM = {.tag = HARDWARE_MODULE_TAG,.version_major = 1,.version_minor = 0,.id = LIGHTS_HARDWARE_MODULE_ID,.name = "lights Module",.author = "Google, Inc.",.methods = &lights_module_methods,};

 

char const *const LCD_FILE = "/sys/class/backlight/pwm-backlight.0/brightness"; 是内核驱动加载后生成的节点文件,应用层传递brightness参数到节点,控制亮度。

 

Android.mk

# Copyright (C) 2008 The Android Open Source Project## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at##      http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.#ifneq ($(filter crespo crespo4g,$(TARGET_DEVICE)),)LOCAL_PATH:= $(call my-dir)# HAL module implemenation, not prelinked and stored in# hw/<COPYPIX_HARDWARE_MODULE_ID>.<ro.board.platform>.soinclude $(CLEAR_VARS)LOCAL_SRC_FILES := lights.cLOCAL_PRELINK_MODULE := falseLOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hwLOCAL_SHARED_LIBRARIES := liblogLOCAL_MODULE := lights.$(TARGET_BOARD_PLATFORM)#LOCAL_MODULE := lights.default#LOCAL_MODULE_TAGS := optionalLOCAL_MODULE_TAGS := enginclude $(BUILD_SHARED_LIBRARY)#endif


编译的时候遇到的问题:

1、编译之后没有生成lights.mini6410.so,原因是Android.mk中的这一句没有执行时判断不通过:ifneq ($(filter crespo crespo4g,$(TARGET_DEVICE)),),将其屏蔽就可以生成所需的文件了。

2、在out/target/product/mini6410/system/lib/目录下没有产生 lights.mini6410.so文件, 是由于LOCAL_MODULE_TAGS的值得原因, 当LOCAL_MODULE_TAGS := optional时,编译生成的库文件到了out/target/product/mini6410/symbols/system/lib/目录下;当LOCAL_MODULE_TAGS := eng 时,编译生成的库文件到了out/target/product/mini6410/system/lib/目录下,android2.3版本是这样,也许高级的版本不是这样,有待验证。

这有一篇参考文章:http://lengnuanyangguang.blog.163.com/blog/static/556764452012659239323/

 

 Android.mk中的LOCAL_MODULE的名字的取法也是有讲究的,应该是对应的 xxx.xxx,前一个给功能,后一个为板子的名称或者default ,名字例如mini6410,,和out/target/product/mini6410一致。

0 0
原创粉丝点击