Android系統電量指示燈 Cubietruck

請先移步,對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

參考如下三篇博文
php

1. 系統服務的啓動方式html

http://blog.csdn.net/windskier/article/details/6417657java


2. Android之BatteryServicepython

http://www.cnblogs.com/armlinux/archive/2010/09/15/2396916.htmllinux


3. android 2.3 電量管理android

http://blog.csdn.net/z642010820/article/details/7341469


android下面也是調用相同的battrey_leds.sh文件
不過android的uevent觸發事件已經在系統自帶的電池服務裏有了,咱們只需在其中執行腳本battrey_leds.sh便可
從上圖能夠看到, 只需在JNI更新電流值以後,執行sh便可

git

=====對上圖作一個簡要說明========

web

1. android系統服務vim

V2.0_A20\android\frameworks\base\services\java\com\android\server\SystemServer.javabash

  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
相關文章
相關標籤/搜索