Android电池驱动电池服务(自用)
2015-07-27 14:27
357 查看
摘要 在cubietruck的android系统里控制led指示灯,指示电量变化
cubietruck android
请先移步,对led的操作,我们使用相同的battrey_leds.sh
http://forum.cubietech.com/forum.php?mod=viewthread&tid=3212&highlight=%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%AD%A6%E4%B9%A0
[嵌入式学习]led 子系统与led trigger
参考以下三篇博文
1. 系统服务的启动方式
/article/2814601.html
2. Android之BatteryService
/article/4748329.html
3. android 2.3 电量管理
/article/9507850.html
android下面也是调用相同的battrey_leds.sh文件
不过android的uevent触发事件已经在系统自带的电池服务里有了,我们只需在其中执行脚本battrey_leds.sh即可
从上图可以看到, 只需在JNI更新电流值之后,执行sh即可
=====对上图做一个简要说明========
1. android系统服务
V2.0_A20\android\frameworks\base\services\java\com\android\server\SystemServer.java
battery = new BatteryService(context, lights); //电池服务
2. android电池服务
V2.0_A20\android\frameworks\base\services\java\com\android\server\BatteryService.java
mPowerSupplyObserver.startObserving("SUBSYSTEM=power_supply");//注册Uevent,监听power_supply
//UEvent与内核socket通讯,一个死循环,内核有事件上报,就触发onUEvent
public void onUEvent(UEventObserver.UEvent event) {
synchronized (mLock) {
updateLocked(); //看309L
}
}
native_update(); //刷新电量,调用电池服务JNI层的函数
processValuesLocked();//发布电量更新的广播
3. android电池服务JNI
V2.0_A20\android\frameworks\base\services\jni\com_android_server_BatteryService.cpp
//这个JNI与java层共享变量
//电量等参数在java层定义,即在BatteryService.java中定义,在这里使用
android_server_BatteryService_update //刷新电量等参数
4. android UEvent
V2.0_A20\android\\frameworks\base\core\java\android\os\UEventObserver.java
while(true) // 线程里的一个死循环,一直等待内核上报事件
observer.onUEvent(event);//回调观察者注册的 onUEvent函数 ,最终调用BatteryService.java里的onUEvent
====具体实施步骤====
1. 在电池服务的JNI层com_android_server_BatteryService.cpp里增加脚本执行函数
static int exeCmd(const char* cmd)
{
if (!cmd)
return -1;
int ret = system(cmd);
if(ret < 0){
ALOGE("==========exeCmd error '%s'", cmd);
}
return 0;
}
暴露给BatteryService.java
的接口native_setBatLeds
//设置电池灯
static void android_server_BatteryService_setBatLeds(){
ALOGE("==========android_server_BatteryService_setBatLeds");
exeCmd("sh /system/bin/battrey_leds.sh");
}
//增加设置电池灯native_setBatLeds
static JNINativeMethod sMethods[] = {
/* name, signature, funcPtr */
{"native_update", "()V", (void*)android_server_BatteryService_update},
{"native_shutdown","()V",(void*)android_server_BatteryService_shutDownNotFromPMS},
{"native_setBatLeds","()V",(void*)android_server_BatteryService_setBatLeds},
};
2. 在电池服务 BatteryService.java里
声明JNI接口
private native void native_setBatLeds();
在updateLocked()里调用即可
private void updateLocked() {
if (!mUpdatesStopped) {
// Update the values of mAcOnline, et. all.
native_update();
//JNI层设置电池灯
native_setBatLeds();
// Process the new values.
processValuesLocked();
}
}
3. 不过需要注意文件节点的权限
在android/device/softwinner/sugar-cubietruck/init.sun7i.rc
chown system system /sys/class/leds/xxx/brightness
chown system system /sys/class/leds/xxx/trigger
chomd 0777 /sys/class/leds/XXX/brightness
chomd 0777 /sys/class/leds/XXX/trigger
xxx替换成你想操作的led灯即可
5. 把battrey_leds.sh放到
android/out/target/product/sugar-cubietruck/system/bin
chmod +x
这里还可以用另外的方法 把battrey_leds.sh文件copy进文件系统
可以参考
android\device\softwinner\sugar-cubietruck\sugar_cubietruck.mk
android/device/softwinner/wing-common/ProductCommon.mk
里的PRODUCT_COPY_FILES字段
=====================================================
最后奉上我的android编译步骤总结
---------------install JDK--------------
$ wget dl.cubieboard.org/software/tools/android/jdk1.6.0_45.tar.gz
$ sudo vim ~/.bashrc
Add :
JAVA_HOME=/work/tools/jdk1.6.0_45
export JRE_HOME=/work/tools/jdk1.6.0_45/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
$ source ~/.bashrc
---------------install tools--------------
$ sudo apt-get install git gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 mingw32 tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev
$ sudo apt-get install xsltproc
$ sudo apt-get install bison
$ sudo apt-get install flex
$ sudo apt-get install gperf
$ sudo apt-get install g++
$ sudo apt-get install gcc-multilib
$ sudo apt-get install libxml2-utils
---------------download source code--------------
$ mkdir /home/box/work/android_build
$ wget http://dl.cubieboard.org/softwar ... droid_source.tar.gz
$ tar -zxvf v2.0_A20_android_source.tar.gz
---------------build kernel--------------
$ cd lichee/linux-3.4
$ make clean
$ cp arch/arm/configs/cubietruck_config .config
$ cd ..
$ ./build.sh -p sun7i_android
---------------build android--------------
$ cd ../android
$ source build/envsetup.sh
$ lunch
$ 16 //note:select sugar_cubietruck-eng //有针对性的查看一下,后缀eng 表示工程机 userdebug开发调试机 user最终用户机
$ extract-bsp //它的作用就是将内核中生成的驱动等拷贝到产品中 拷贝内核生成的module 和 *.image
$ make -j8 //第一次这里最好不要加j8,否则内存不够会出错,如果出错,尝试用j2, j4 试试
$ pack
cubietruck android
请先移步,对led的操作,我们使用相同的battrey_leds.sh
http://forum.cubietech.com/forum.php?mod=viewthread&tid=3212&highlight=%E5%B5%8C%E5%85%A5%E5%BC%8F%E5%AD%A6%E4%B9%A0
[嵌入式学习]led 子系统与led trigger
参考以下三篇博文
1. 系统服务的启动方式
/article/2814601.html
2. Android之BatteryService
/article/4748329.html
3. android 2.3 电量管理
/article/9507850.html
android下面也是调用相同的battrey_leds.sh文件
不过android的uevent触发事件已经在系统自带的电池服务里有了,我们只需在其中执行脚本battrey_leds.sh即可
从上图可以看到, 只需在JNI更新电流值之后,执行sh即可
=====对上图做一个简要说明========
1. android系统服务
V2.0_A20\android\frameworks\base\services\java\com\android\server\SystemServer.java
battery = new BatteryService(context, lights); //电池服务
2. android电池服务
V2.0_A20\android\frameworks\base\services\java\com\android\server\BatteryService.java
mPowerSupplyObserver.startObserving("SUBSYSTEM=power_supply");//注册Uevent,监听power_supply
//UEvent与内核socket通讯,一个死循环,内核有事件上报,就触发onUEvent
public void onUEvent(UEventObserver.UEvent event) {
synchronized (mLock) {
updateLocked(); //看309L
}
}
native_update(); //刷新电量,调用电池服务JNI层的函数
processValuesLocked();//发布电量更新的广播
3. android电池服务JNI
V2.0_A20\android\frameworks\base\services\jni\com_android_server_BatteryService.cpp
//这个JNI与java层共享变量
//电量等参数在java层定义,即在BatteryService.java中定义,在这里使用
android_server_BatteryService_update //刷新电量等参数
4. android UEvent
V2.0_A20\android\\frameworks\base\core\java\android\os\UEventObserver.java
while(true) // 线程里的一个死循环,一直等待内核上报事件
observer.onUEvent(event);//回调观察者注册的 onUEvent函数 ,最终调用BatteryService.java里的onUEvent
====具体实施步骤====
1. 在电池服务的JNI层com_android_server_BatteryService.cpp里增加脚本执行函数
static int exeCmd(const char* cmd)
{
if (!cmd)
return -1;
int ret = system(cmd);
if(ret < 0){
ALOGE("==========exeCmd error '%s'", cmd);
}
return 0;
}
暴露给BatteryService.java
的接口native_setBatLeds
//设置电池灯
static void android_server_BatteryService_setBatLeds(){
ALOGE("==========android_server_BatteryService_setBatLeds");
exeCmd("sh /system/bin/battrey_leds.sh");
}
//增加设置电池灯native_setBatLeds
static JNINativeMethod sMethods[] = {
/* name, signature, funcPtr */
{"native_update", "()V", (void*)android_server_BatteryService_update},
{"native_shutdown","()V",(void*)android_server_BatteryService_shutDownNotFromPMS},
{"native_setBatLeds","()V",(void*)android_server_BatteryService_setBatLeds},
};
2. 在电池服务 BatteryService.java里
声明JNI接口
private native void native_setBatLeds();
在updateLocked()里调用即可
private void updateLocked() {
if (!mUpdatesStopped) {
// Update the values of mAcOnline, et. all.
native_update();
//JNI层设置电池灯
native_setBatLeds();
// Process the new values.
processValuesLocked();
}
}
3. 不过需要注意文件节点的权限
在android/device/softwinner/sugar-cubietruck/init.sun7i.rc
chown system system /sys/class/leds/xxx/brightness
chown system system /sys/class/leds/xxx/trigger
chomd 0777 /sys/class/leds/XXX/brightness
chomd 0777 /sys/class/leds/XXX/trigger
xxx替换成你想操作的led灯即可
5. 把battrey_leds.sh放到
android/out/target/product/sugar-cubietruck/system/bin
chmod +x
这里还可以用另外的方法 把battrey_leds.sh文件copy进文件系统
可以参考
android\device\softwinner\sugar-cubietruck\sugar_cubietruck.mk
android/device/softwinner/wing-common/ProductCommon.mk
里的PRODUCT_COPY_FILES字段
=====================================================
最后奉上我的android编译步骤总结
---------------install JDK--------------
$ wget dl.cubieboard.org/software/tools/android/jdk1.6.0_45.tar.gz
$ sudo vim ~/.bashrc
Add :
JAVA_HOME=/work/tools/jdk1.6.0_45
export JRE_HOME=/work/tools/jdk1.6.0_45/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
$ source ~/.bashrc
---------------install tools--------------
$ sudo apt-get install git gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 mingw32 tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev
$ sudo apt-get install xsltproc
$ sudo apt-get install bison
$ sudo apt-get install flex
$ sudo apt-get install gperf
$ sudo apt-get install g++
$ sudo apt-get install gcc-multilib
$ sudo apt-get install libxml2-utils
---------------download source code--------------
$ mkdir /home/box/work/android_build
$ wget http://dl.cubieboard.org/softwar ... droid_source.tar.gz
$ tar -zxvf v2.0_A20_android_source.tar.gz
---------------build kernel--------------
$ cd lichee/linux-3.4
$ make clean
$ cp arch/arm/configs/cubietruck_config .config
$ cd ..
$ ./build.sh -p sun7i_android
---------------build android--------------
$ cd ../android
$ source build/envsetup.sh
$ lunch
$ 16 //note:select sugar_cubietruck-eng //有针对性的查看一下,后缀eng 表示工程机 userdebug开发调试机 user最终用户机
$ extract-bsp //它的作用就是将内核中生成的驱动等拷贝到产品中 拷贝内核生成的module 和 *.image
$ make -j8 //第一次这里最好不要加j8,否则内存不够会出错,如果出错,尝试用j2, j4 试试
$ pack
相关文章推荐
- android intentService(三)
- Android中Bitmap格式压缩存储
- Android缩放动画
- “哎哟!蛮吊的” 之 Android Activity生命周期
- Android缩放动画
- android 位移动画移动后原地绑定的点击事件还在
- Android源码——安卓聊天
- Android Logo 尺寸比例制作
- Android RSA加密解密功能的实现
- Android ndk 单步调试
- Android碎片第三期
- Android Studio手动导入第三方类库
- 【第五篇】androidEventbus源代码阅读和分析之发送粘性事件和接收粘性事件代码分析
- android底部弹出菜单
- android listView点击item,高亮显示
- Android完全退出程序
- android service(二)
- 通过html页面打开Android本地的app
- Android ServiceManager启动
- android4.4修改设置界面里,蓝牙默认名称