CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 7048|回复: 2

Android系统电量指示灯 CT

[复制链接]
发表于 2014-12-2 19:02:03 | 显示全部楼层 |阅读模式
本帖最后由 yeyunxiaopan 于 2014-12-2 19:02 编辑

请先移步,对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. 系统服务的启动方式

2. Android之BatteryService

3. android 2.3 电量管理
http://blog.csdn.net/z642010820/article/details/7341469


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
  1.   battery = new BatteryService(context, lights); //电池服务
复制代码


2. android电池服务
V2.0_A20\android\frameworks\base\services\java\com\android\server\BatteryService.java
  1. mPowerSupplyObserver.startObserving("SUBSYSTEM=power_supply");//注册Uevent,监听power_supply
复制代码

//UEvent与内核socket通讯,一个死循环,内核有事件上报,就触发onUEvent

  1. public void onUEvent(UEventObserver.UEvent event) {
  2.     synchronized (mLock) {
  3.         updateLocked(); //看309L
  4.     }
  5.         }


  6.   native_update(); //刷新电量,调用电池服务JNI层的函数
  7. processValuesLocked();//发布电量更新的广播
复制代码


3. android电池服务JNI
V2.0_A20\android\frameworks\base\services\jni\com_android_server_BatteryService.cpp

//这个JNI与java层共享变量
//电量等参数在java层定义,即在BatteryService.java中定义,在这里使用
  1. android_server_BatteryService_update //刷新电量等参数
复制代码
4. android UEvent
V2.0_A20\android\\frameworks\base\core\java\android\os\UEventObserver.java

  1. while(true) // 线程里的一个死循环,一直等待内核上报事件
  2. observer.onUEvent(event);//回调观察者注册的 onUEvent函数 ,最终调用BatteryService.java里的onUEvent
复制代码


====具体实施步骤====
1. 在电池服务的JNI层com_android_server_BatteryService.cpp里增加脚本执行函数
  1. static int exeCmd(const char* cmd)
  2. {

  3.     if (!cmd)
  4.         return -1;
  5.                         
  6.     int ret = system(cmd);
  7.         if(ret < 0){
  8.                 ALOGE("==========exeCmd error '%s'", cmd);         
  9.         }
  10.         
  11.     return 0;
  12. }
复制代码
暴露给BatteryService.java 的接口native_setBatLeds
  1. //设置电池灯

  2. static void android_server_BatteryService_setBatLeds(){
  3.     ALOGE("==========android_server_BatteryService_setBatLeds");

  4.         exeCmd("sh /system/bin/battrey_leds.sh");
  5. }

  6. //增加设置电池灯native_setBatLeds
  7. static JNINativeMethod sMethods[] = {
  8.      /* name, signature, funcPtr */
  9.         {"native_update", "()V", (void*)android_server_BatteryService_update},
  10.     {"native_shutdown","()V",(void*)android_server_BatteryService_shutDownNotFromPMS},        
  11.     {"native_setBatLeds","()V",(void*)android_server_BatteryService_setBatLeds},         
  12. };
复制代码
2. 在电池服务 BatteryService.java里 声明JNI接口
  1. private native void native_setBatLeds();
复制代码
在updateLocked()里调用即可
  1. private void updateLocked() {
  2.         if (!mUpdatesStopped) {
  3.             // Update the values of mAcOnline, et. all.
  4.             native_update();

  5.                         //JNI层设置电池灯
  6.                     native_setBatLeds();
  7.                               
  8.             // Process the new values.
  9.             processValuesLocked();
  10.         }
  11.     }        
复制代码
   

3. 不过需要注意文件节点的权限
在android/device/softwinner/sugar-cubietruck/init.sun7i.rc
  1. chown system system /sys/class/leds/xxx/brightness
  2. chown system system /sys/class/leds/xxx/trigger
  3. chomd 0777 /sys/class/leds/XXX/brightness
  4. 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编译步骤总结
  1. ---------------install JDK--------------
  2. $ wget dl.cubieboard.org/software/tools/android/jdk1.6.0_45.tar.gz
  3. $ sudo vim ~/.bashrc

  4. Add :
  5. JAVA_HOME=/work/tools/jdk1.6.0_45
  6. export JRE_HOME=/work/tools/jdk1.6.0_45/jre
  7. export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

  8. $ source ~/.bashrc


  9. ---------------install tools--------------
  10. $ sudo apt-get install git gnupg flex bison gperf build-essential \
  11. zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
  12. libx11-dev:i386 libreadline6-dev:i386 mingw32 tofrodos \
  13. python-markdown libxml2-utils xsltproc zlib1g-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev

  14. $ sudo apt-get install xsltproc
  15. $ sudo apt-get install bison
  16. $ sudo apt-get install flex
  17. $ sudo apt-get install gperf
  18. $ sudo apt-get install g++
  19. $ sudo apt-get install gcc-multilib
  20. $ sudo apt-get install libxml2-utils


  21. ---------------download source code--------------
  22. $ mkdir /home/box/work/android_build
  23. $ wget http://dl.cubieboard.org/softwar ... droid_source.tar.gz
  24. $ tar -zxvf v2.0_A20_android_source.tar.gz


  25. ---------------build kernel--------------
  26. $ cd lichee/linux-3.4
  27. $ make clean
  28. $ cp arch/arm/configs/cubietruck_config .config   
  29. $ cd ..
  30. $ ./build.sh -p sun7i_android





  31. ---------------build android--------------
  32. $ cd ../android
  33. $ source build/envsetup.sh
  34. $ lunch
  35. $ 16     //note:select sugar_cubietruck-eng  //有针对性的查看一下,后缀eng 表示工程机    userdebug开发调试机   user最终用户机
  36. $ extract-bsp   //它的作用就是将内核中生成的驱动等拷贝到产品中  拷贝内核生成的module 和  *.image
  37. $ make -j8  //第一次这里最好不要加j8,否则内存不够会出错,如果出错,尝试用j2, j4 试试
  38. $ pack
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

发表于 2014-12-4 14:20:33 | 显示全部楼层
写的很好顶一个!!!!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2022-8-11 10:26 , Processed in 0.028062 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部