第4课第3节_Android灯光系统_编写HAL_lights.c

JNI文件:com_Android_server_LedService.cpp

注册本地方法,会加载HAL文件:

3. 编写android灯光系统的hal程序

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函数

HAL: lights.c

把新文件上传到服务器, 所在目录:
hardware/libhardware/modules/lights/led_hal.c
hardware/libhardware/modules/lights/Android.mk
Android.mk内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := lights.tiny4412
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)

修改
vi vendor/friendly-arm/tiny4412/device-tiny4412.mk

ifeq ($(BOARD_USES_PWMLIGHTS),false)
#PRODUCT_COPY_FILES += #       $(VENDOR_PATH)/proprietary/lights.tiny4412.so:system/lib/hw/lights.tiny4412.so
endif

编译:执行mmm命令之前先执行这几个命令:



$ mmm hardware/libhardware/modules/lights
$ make snod
$ ./gen-img.sh
用这个命令确保我们提供的lights.c已经编进system.img:
diff vendor/friendly-arm/tiny4412/proprietary/lights.tiny4412.so out/target/product/tiny4412/system/lib/hw/lights.tiny4412.so

没有修改代码进行强制编译 -B

内核也需要修改:修改权限
1. drivers/leds/led-class.c: 0644 改为 0666
static struct device_attribute led_class_attrs[] = {
    __ATTR(brightness, 0666, led_brightness_show, led_brightness_store),
    __ATTR(max_brightness, 0444, led_max_brightness_show, NULL),
#ifdef CONFIG_LEDS_TRIGGERS
    __ATTR(trigger, 0666, led_trigger_show, led_trigger_store),
#endif
    __ATTR_NULL,
};

2. drivers/leds/ledtrig-timer.c: 0644 改为 0666
#if defined(CONFIG_MACH_IPCAM)
static DEVICE_ATTR(delay_on, 0666, led_delay_on_show, led_delay_on_store);
static DEVICE_ATTR(delay_off, 0666, led_delay_off_show, led_delay_off_store);
#else
static DEVICE_ATTR(delay_on, 0666, led_delay_on_show, led_delay_on_store);
static DEVICE_ATTR(delay_off, 0666, led_delay_off_show, led_delay_off_store);
#endif

make zImage

用这个命令确保我们提供的lights.c已经编进system.img:
diff vendor/friendly-arm/tiny4412/proprietary/lights.tiny4412.so out/target/product/tiny4412/system/lib/hw/lights.tiny4412.so

logcat lights:V *:S

				
时间: 2024-10-13 12:42:15

第4课第3节_Android灯光系统_编写HAL_lights.c的相关文章

8.3 Android灯光系统_编写HAL_lights.c

注意在led-classes.c中定义的led_class_attrs[]所建立的文件的属性应该改为0666,否则应用程序无权操作它 同时ledtrig-time.c里面对应新建的那几个delay_on/delay_off也要改为0666,这样才能写它 Java: frameworks/base/services/core/java/com/android/server/lights/LightsService.javaJNI: frameworks/base/services/core/jni

第6课第2节_Binder系统_驱动情景分析_打印数据交互过程

添加宏: 功能:把NAME(n) 中的n作为字符串返回,eg:BR_NOOP作为字符串返回 BR开头:Binder--->IPC BC开头:IPC------>Binder #define NAME(n) case n: return #n const char *binder_cmd_name(uint32_t cmd) { switch(cmd) { NAME(BR_NOOP); NAME(BR_TRANSACTION_COMPLETE); NAME(BR_INCREFS); NAME(B

赵雅智_android实例_当监听类有数据更新时下拉刷新

之前两篇文章分别介绍了OnScrollListener的实现和ContentProvider监听数据的变化,下面我们就结合者两个知识点实现一个小项目 项目需求 使用当ContentProvider监听类有数据更新时,在当前界面进行提示,并用OnScrollListener实现下拉刷新 实现效果 通过ContentProvider显示数据在界面 当监听类发生变化时 下拉刷新后显示数据 实现步骤 android_sqlite项目 定义操作标识 匹配结果码 继承ContentProvider类重写方法

赵雅智_Android案例_刮刮乐

实现效果 主要代码 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <I

第1课第4.4节_Android硬件访问服务编写HAL代码

4 编写HAL代码 源码下载方法 第一次: git clone https://github.com/weidongshan/SYS_0001_LEDDemo.git 更新: git pull origin 取出指定版本: git checkout v1 // 有JNI没有HAL git checkout v2 // 有JNI,HAL git checkout v3 // add MODULE TAG, DEVICE TAG JNI 向上提供本地函数, 向下加载HAL文件并调用HAL的函数HAL

第7课第2节_Binder系统_c++实现_编译测试

七. Binder系统之服务的c++实现1. 编写代码参考文件:frameworks\av\include\media\IMediaPlayerService.h (IMediaPlayerService,BnMediaPlayerService)frameworks\av\media\libmedia\IMediaPlayerService.cpp (BpMediaPlayerService)frameworks\av\media\libmediaplayerservice\MediaPlay

09课第3节u-boot分析源码第1阶段

一般来说,uboot会干这几件事; 1:  关开门狗 2:初开始时钟,PLL倍频.上电的时候,是以XTAL的12M运行的运行的,然后你要提高频率,三星2440能以最大400MHZ运行 3:初开始化内存,SDRAM或DDR(2440不支持DDR ,ARM11可以): 4:从NANDfalsh里面把内核读出来,放到SDRAM里面去,然后调转到SDRAM运行; uboot放到SDRAM哪里呢?这个是链接脚本决定的; 比如现在我放是的链接地址是0x33f80000 ; 那什么又是链接地址,就是程序运行时

第二课 第六节 面向对象(对象与类)、命名规范

1.面向对象 --一切事物皆对象,通过面向对象的方式,将现实世界的事物 抽象成对象,现实世界中的关系抽象成类.继承,帮助人们 实现对现实世界的抽象与数字建模. 2.对象 --对象是具体存在的.看得见.摸得着.可以直接使用的东西. 3.类 --类的实质是一种数据类型,类是对现实生活中一类具有共同特 征的事物的抽象. 4.变量的命名规范 --变量名应该是一个名词 --如果只有一个单词则全部小写,如果多个单词,除一个单词 以外,其余首字母大写.若变量是缩写,应该全部大写. --变量命名要有意义,不能乱

第2课—第5节

语法结构:程序流程控制(Java 中的语句) 单词→ 变量. 句子→ 语法结构. if ()后面不加大括号的话,只控制离它最近的一条语句. if else语句与三目运算符区别: b=(a>1)?System.out.println("haha"):200;这句话是没有输出结果的,所以是错误的. 三目运算符简化运算,但是功能不足. if else 判断例子: 输出结果:a 执行完第一句就结束了. if else 判断语句例子: 其中n=3; 输出结果:a,b,d. 只有第三条语句未