一、android灯光系统框架:

Java: frameworks/base/services/core/java/com/android/server/lights/LightsService.java
JNI: frameworks/base/services/core/jni/com_android_server_lights_LightsService.cpp
Hal: lights.c

默认配色:frameworks/base/core/res/res/values/config.xml
电池灯:frameworks/base/services/core/java/com/android/server/BatteryService.java
通知灯:frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.java

怎么写LIGHTS HAL
a. 实现一个名为HMI的hw_module_t结构体
b. 实现一个open函数, 它会根据name返回一个light_device_t结构体
c. 实现多个light_device_t结构体,每一个对应一个DEVICE
light_device_t结构体里第1个成员是hw_device_t结构体, 紧接着一个set_light函数

二、代码lights.c:

/*
* Copyright (C) 2008 The Android Open Source Project
* Copyright (C) 2011 Diogo Ferreira <defer@cyanogenmod.com>
* Copyright (C) 2012 Andreas Makris <andreas.makris@gmail.com>
* Copyright (C) 2012 The CyanogenMod Project <http://www.cyanogenmod.com>
*
* 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_NDEBUG 0
#define LOG_TAG "lights"
#include <cutils/log.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <hardware/lights.h> char const*const RED_LED_FILE = "/sys/class/leds/led1/brightness";
char const*const GREEN_LED_FILE = "/sys/class/leds/led2/brightness";
char const*const BLUE_LED_FILE = "/sys/class/leds/led3/brightness";
char const*const RED_LED_FILE_TRIGGER = "/sys/class/leds/led1/trigger";
char const*const GREEN_LED_FILE_TRIGGER = "/sys/class/leds/led2/trigger";
char const*const BLUE_LED_FILE_TRIGGER = "/sys/class/leds/led3/trigger";
char const*const RED_LED_FILE_DELAYON = "/sys/class/leds/led1/delay_on";
char const*const GREEN_LED_FILE_DELAYON = "/sys/class/leds/led2/delay_on";
char const*const BLUE_LED_FILE_DELAYON = "/sys/class/leds/led3/delay_on";
char const*const RED_LED_FILE_DELAYOFF = "/sys/class/leds/led1/delay_off";
char const*const GREEN_LED_FILE_DELAYOFF= "/sys/class/leds/led2/delay_off";
char const*const BLUE_LED_FILE_DELAYOFF = "/sys/class/leds/led3/delay_off";
char const*const LCD_BACKLIGHT_FILE = "/dev/backlight-1wire"; /* Synchronization primities */
static pthread_once_t g_init = PTHREAD_ONCE_INIT;
static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER;
/* Mini-led state machine */
static struct light_state_t g_notification;
static struct light_state_t g_battery; static int write_int (const char *path, int value) {
int fd;
static int already_warned = ;
fd = open(path, O_RDWR);
if (fd < ) {
if (already_warned == ) {
ALOGE("write_int failed to open %s\n", path);
already_warned = ;
}
return -errno;
}
char buffer[];
int bytes = snprintf(buffer, sizeof(buffer), "%d\n", value);
int written = write (fd, buffer, bytes);
close(fd);
return written == - ? -errno : ;
}
static int write_string (const char *path, const char *value) {
int fd;
static int already_warned = ;
fd = open(path, O_RDWR);
if (fd < ) {
if (already_warned == ) {
ALOGE("write_string failed to open %s\n", path);
already_warned = ;
}
return -errno;
}
char buffer[];
int bytes = snprintf(buffer, sizeof(buffer), "%s\n", value);
int written = write (fd, buffer, bytes);
close(fd);
return written == - ? -errno : ;
}
/* Color tools */
static int is_lit (struct light_state_t const* state) {
return state->color & 0x00ffffff;
}
static int rgb_to_brightness (struct light_state_t const* state) {
int color = state->color & 0x00ffffff;
return ((*((color>>)&0x00ff))
+ (*((color>>)&0x00ff)) + (*(color&0x00ff))) >> ;
}
/* The actual lights controlling section */
static int set_light_backlight (struct light_device_t *dev, struct light_state_t const *state) {
int brightness = rgb_to_brightness(state);
ALOGV("%s brightness=%d color=0x%08x", __func__,brightness,state->color);
pthread_mutex_lock(&g_lock); /* brightness 0-255 */
/* LCD_BACKLIGHT_FILE能接收是0-127 */ write_int (LCD_BACKLIGHT_FILE, brightness/); pthread_mutex_unlock(&g_lock);
return ;
}
static void set_shared_light_locked (struct light_device_t *dev, struct light_state_t *state) {
int r, g, b;
int delayOn,delayOff;
r = (state->color >> ) & 0xFF;
g = (state->color >> ) & 0xFF;
b = (state->color) & 0xFF;
delayOn = state->flashOnMS;
delayOff = state->flashOffMS;
if (state->flashMode != LIGHT_FLASH_NONE) {
write_string (RED_LED_FILE_TRIGGER, "timer");
write_string (GREEN_LED_FILE_TRIGGER, "timer");
write_string (BLUE_LED_FILE_TRIGGER, "timer");
write_int (RED_LED_FILE_DELAYON, delayOn);
write_int (GREEN_LED_FILE_DELAYON, delayOn);
write_int (BLUE_LED_FILE_DELAYON, delayOn);
write_int (RED_LED_FILE_DELAYOFF, delayOff);
write_int (GREEN_LED_FILE_DELAYOFF, delayOff);
write_int (BLUE_LED_FILE_DELAYOFF, delayOff);
} else {
write_string (RED_LED_FILE_TRIGGER, "none");
write_string (GREEN_LED_FILE_TRIGGER, "none");
write_string (BLUE_LED_FILE_TRIGGER, "none");
}
write_int (RED_LED_FILE, r);
write_int (GREEN_LED_FILE, g);
write_int (BLUE_LED_FILE, b);
}
static void handle_shared_battery_locked (struct light_device_t *dev) {
if (is_lit (&g_notification)) {
set_shared_light_locked (dev, &g_notification);
} else {
set_shared_light_locked (dev, &g_battery);
}
}
static int set_light_battery (struct light_device_t *dev, struct light_state_t const* state) { ALOGV("%s flashMode=%d onMS = %d offMS = %d color=0x%08x", __func__,state->flashMode,state->flashOnMS,state->flashOffMS,state->color); pthread_mutex_lock (&g_lock);
g_battery = *state;
handle_shared_battery_locked(dev);
pthread_mutex_unlock (&g_lock);
return ;
}
static int set_light_notifications (struct light_device_t *dev, struct light_state_t const* state) {
ALOGV("%s flashMode=%d onMS = %d offMS = %d color=0x%08x", __func__,state->flashMode,state->flashOnMS,state->flashOffMS,state->color);
pthread_mutex_lock (&g_lock);
g_notification = *state;
handle_shared_battery_locked(dev);
pthread_mutex_unlock (&g_lock);
return ;
}
/* Initializations */
void init_globals () {
pthread_mutex_init (&g_lock, NULL);
}
/* Glueing boilerplate */
static int close_lights (struct light_device_t *dev) {
if (dev)
free(dev);
return ;
}
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);
if ( == strcmp(LIGHT_ID_BACKLIGHT, name)) {
set_light = set_light_backlight;
}
else if ( == strcmp(LIGHT_ID_BATTERY, name)) {
set_light = set_light_battery;
}
else if ( == strcmp(LIGHT_ID_NOTIFICATIONS, name)) {
set_light = set_light_notifications;
}
else {
return -EINVAL;
}
pthread_once (&g_init, init_globals);
struct light_device_t *dev = malloc(sizeof (struct light_device_t));
memset(dev, , sizeof(*dev));
dev->common.tag = HARDWARE_DEVICE_TAG;
dev->common.version = ;
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 ;
}
static struct hw_module_methods_t lights_module_methods = {
.open = open_lights,
};
struct hw_module_t HAL_MODULE_INFO_SYM = {
.tag = HARDWARE_MODULE_TAG,
.version_major = ,
.version_minor = ,
.id = LIGHTS_HARDWARE_MODULE_ID,
.name = "Sony lights module",
.author = "Diogo Ferreira <defer@cyanogenmod.com>, Andreas Makris <Andreas.Makris@gmail.com>",
.methods = &lights_module_methods,
};

三、Android.mk

# Copyright (C)  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. LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := lights.tiny4412 # HAL module implementation stored in
# hw/<VIBRATOR_HARDWARE_MODULE_ID>.default.so
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_C_INCLUDES := hardware/libhardware
LOCAL_SRC_FILES := lights.c
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_MODULE_TAGS := eng include $(BUILD_SHARED_LIBRARY)

Android system :灯光系统_HAL_lights的更多相关文章

  1. The behavior of App killed or restored by Android System or by users

    What's the behavior of App killed or restored by Android System or by users? First, user kills the a ...

  2. 解决appium自带的Chromedriver版本和设备Android System Webview版本不一致的问题

    报错信息 selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred w ...

  3. android system.img

    哥们要我做些模拟包,给过来的是mtk的底包,需要从system.img中提取部分文件. 网上一找资料,说是yaffs2文件系统,同时以前做linux的时候也是用yaffs2,感觉碰到老朋友了,不管三七 ...

  4. 图解Android - System Service 概论 和 Android GUI 系统

    通过 图解Android - Binder 和 Service 一文中,我们已经分析了Binder 和 Service的工作原理.接下来,我们来简要分析Android 系统里面都有哪些重要的Servi ...

  5. Android Capture Android System Audio

    项目需要获取播放视频的实时音量值,最简捷的方法是监听音频输出端,取得音频输出流,再进行转换. 调查时,首先找到这篇博客: http://blog.csdn.net/jinzhuojun/article ...

  6. Android System Property 解析

    一 System Property       今天在折腾HDMI 显示,为Setting提供接口,遇到非常多跟Android系统属性相关的问题.因此,顺便分析和总结一些. android的代码中大量 ...

  7. Hooking Android System Calls for Pleasure and Benefit

    The Android kernel is a powerful ally to the reverse engineer. While regular Android apps are hopele ...

  8. 安卓系统广播暴露设备信息-Android System Broadcasts Expose Device Information

    Android device details are being exposed to running applications via Wi-Fi broadcasts in the mobile ...

  9. 编译android --system,framework

    在你的android 目录下: sudo git clone  https://android.googlesource.com/platform/manifest cd manifest git b ...

随机推荐

  1. python相对目录的基本用法(一)

    一般在代码中涉及到操作文件时,最好使用文件的相对目录,这样在你的程序迁移到别人的电脑时,可以保证不会出现文件读取异常的错误(另外,自动化测试时用例的读取也要用相对目录) 例子1 假如工程文件的目录结构 ...

  2. python爬虫学习(二):定向爬虫例子-->使用BeautifulSoup爬取"软科中国最好大学排名-生源质量排名2018",并把结果写进txt文件

    在正式爬取之前,先做一个试验,看一下爬取的数据对象的类型是如何转换为列表的: 写一个html文档: x.html<html><head><title>This is ...

  3. ubuntu无法关机,卡死

    (1)第一种方法(可行,但开关机出现命令行代码) $ sudo vim /etc/default/grub 将GRUB_CMDLINE_LINUX_DEFAULT="quiet splash ...

  4. Android BottomNavigationBar底部导航控制器的使用(包含默认postion的设置)

    转载请标明出处:http://blog.csdn.net/u010046908/article/details/50962081本文出自:[李东的博客] 最近Google在自己推出的Material ...

  5. 373. Find K Pairs with Smallest Sums (java,优先队列)

    题目: You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. Def ...

  6. numpy学习:数据预处理

    待处理的数据:150*150的灰度图片,除分析目标外,背景已经抹0 需要实现的目标:背景数字0不变,对其余数字做一个归一化处理 对list处理可以用 a=list(set(a)) # 实现了去除重复元 ...

  7. python-day72--django实现的cookie/session

    COOKIE 与 SESSION 一.概念cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生.cookie ...

  8. json 常用的序列化 反序列化对象 代码

    序列化对象: ---------------------------------------------------------- Person p = new Person() { Name = & ...

  9. 九、持久层框架(MyBatis)

    一.基于MyBatis的对象关系配置(基于XML方式的配置) 注: MyBatis不能像Hibernate那样,在实体类上配置上注解或者配置xml映射文件,系统启动后就可以自动创建表.因为MyBati ...

  10. oracle 日常设置

    查看缓冲区命令:list  执行save  1.sql 可以吧缓冲区的命令保存下来.  执行 @1.sql可以执行保存下来的内容:  show feedback 显示反馈信息,最后一行.  show ...