CubieBoard中文论坛

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

android平台led开发之应用层——请教

[复制链接]
发表于 2015-3-13 14:25:58 | 显示全部楼层 |阅读模式
      想在cb2上写个简单的apk,通过调用JNI方法实现控制cubieboard上的两个led灯,但本人刚学android,对于android4.2 SDK并不熟悉,不知道应用层具体应该调用哪个service接口,我主要参考下面一位大牛:从内核硬件驱动层一直到JAVA应用层,跟着他的流程发现自己的android4.2 SDK 有很大出入,所以不知道应用层如何调用,请大神指教!

android平台led开发之应用层
手上有一个android开发平台,于是想在底层加个自己的硬件模块然后通过Android的HAL方式向上封装出底层驱动供JAVA APP调用。既然是刚上手,那就用led灯来做为先导开发走走流程吧,至少得把从内核到应用层的流程走通才行。

从底层到上层一共分成四个阶段。
1: 内核硬件驱动层
2: HAL(硬件抽象层)
3: 框架层(framework,包含JNI和实现硬件服务的JAVA接口)
4: JAVA应用层
.......................


还可参考:
android之led子系统分析(一)      Binder service入门—框架层、应用层调用native binder service
  Binder service入门—应用层binder service       Android应用程序jni方式)控制LED/GPIO


回复

使用道具 举报

发表于 2015-3-13 15:57:07 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2015-3-14 10:40:32 | 显示全部楼层
jiangdou 发表于 2015-3-13 15:57
http://blog.csdn.net/jiangdou88/article/details/24502061
http://blog.csdn.net/jiangdou88/article/det ...

好东西。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-14 10:52:17 | 显示全部楼层
jiangdou 发表于 2015-3-13 15:57
http://blog.csdn.net/jiangdou88/article/details/24502061
http://blog.csdn.net/jiangdou88/article/det ...

1.谢谢姜工,上面的方法是自己写内核驱动,如果用自带的驱动也可以吧,但我看了自带的没有led相关的设备节点;如果用自带的驱动,那这条语句:char *led_pin = "/sys/class/gpio_sw/PG11/data";    对于cb2 ,是不是要改成:char *led_pin = "/sys/class/leds/blue:ph20:led1/brightness“;另外这个led_jni.cpp是在哪里编译的,
我在:
le@le:/work/le/a20-android/android/frameworks/base/core/java/com/android/led_jni$ ls
android.mk  led_jni.cpp
编译不了,显示:make: *** 没有规则可以创建目标“libled_jni”。 停止。

2.我参考:http://blog.chinaunix.net/uid-21880738-id-3361037.html
其中:
void led_off(int arg)
{
    switch(arg)
    {
        case 1: gpio_set_value(RK29_PIN6_PB3,GPIO_LOW); //GPIO8
        break;

        case 2: gpio_set_value(RK29_PIN6_PC2,GPIO_LOW); //GPIO10
        break;

        default:
        break;
    }
}
如果我要控制cb2上的两个led,他的端口号为ph20,ph21,那可以直接用gpio_set_value这个函数吗,如果可以的话那端口名在哪里能找到?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-14 11:32:07 | 显示全部楼层
jiangdou 发表于 2015-3-13 15:57
http://blog.csdn.net/jiangdou88/article/details/24502061
http://blog.csdn.net/jiangdou88/article/det ...

姜工,另外我是否可以采用控制GPIO来控制LED灯的亮灭,即在eclipse导入javalib.jar,源码中import android.os.Gpio; 然后采用Gpio.writeGpio(`h`,20,1);来使ph20端输出高电平(ph20是其中一个灯的端口号);先手动关闭板子的led,编译出apk安装到板子上并没有点亮,这样是不是可行还是我哪里出现了错误?
回复 支持 反对

使用道具 举报

发表于 2015-3-14 16:05:20 | 显示全部楼层
本帖最后由 jiangdou 于 2015-3-14 16:09 编辑
蓝天-彭 发表于 2015-3-14 10:52
1.谢谢姜工,上面的方法是自己写内核驱动,如果用自带的驱动也可以吧,但我看了自带的没有led相关的设备 ...

led_jni.cpp是在android的SDK里编译的

有android.mk

编译成xxx.so文件,//  libled_jni.so


java   

  • System.loadLibrary("led_jni");       //加载libled_jni.so




2,函数调用
  • final led_jni ledon = new led_jni();    //  实例化函数
  •         Button bledon = (Button)findViewById(R.id.bledon);
  •         Button bledoff = (Button)findViewById(R.id.bledoff);
  •                 //Button bledon = (Button)findViewById(R.id.bledon);
  •         bledon.setOnClickListener(new View.OnClickListener() {
  •             @Override
  •             public void onClick(View v) {
  •                 // TODO 自动生成的方法存根
  •             ledon.led_on(1);    //打开LED
  •             }
  •         });
  •         bledoff.setOnClickListener(new View.OnClickListener() {
  •             @Override
  •             public void onClick(View v) {
  •                 // TODO 自动生成的方法存根
  •                 ledon.led_off(0);   //关闭LED


//无论怎么打开led,,系统架构很重要,,


回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-14 16:24:31 | 显示全部楼层
jiangdou 发表于 2015-3-14 16:05
led_jni.cpp是在android的SDK里编译的

有android.mk

嗯,我是放在android SDK上编译的,在SDK android目录下执行:
le@le:/work/le/a20-android/android$ make libled_jni -j8
出现错误:
PRODUCT_COPY_FILES device/softwinner/wing-common/googleservice/gapps-jb-20130301-signed/system/tts/lang_pico/es-ES_zl0_sg.bin:system/tts/lang_pico/es-ES_zl0_sg.bin ignored.
PRODUCT_COPY_FILES device/softwinner/wing-common/googleservice/gapps-jb-20130301-signed/system/tts/lang_pico/fr-FR_nk0_sg.bin:system/tts/lang_pico/fr-FR_nk0_sg.bin ignored.
PRODUCT_COPY_FILES device/softwinner/wing-common/googleservice/gapps-jb-20130301-signed/system/tts/lang_pico/de-DE_ta.bin:system/tts/lang_pico/de-DE_ta.bin ignored.
PRODUCT_COPY_FILES device/softwinner/wing-common/googleservice/gapps-jb-20130301-signed/system/tts/lang_pico/de-DE_gl0_sg.bin:system/tts/lang_pico/de-DE_gl0_sg.bin ignored.
PRODUCT_COPY_FILES device/softwinner/wing-common/googleservice/gapps-jb-20130301-signed/system/tts/lang_pico/fr-FR_ta.bin:system/tts/lang_pico/fr-FR_ta.bin ignored.
PRODUCT_COPY_FILES device/softwinner/wing-common/googleservice/gapps-jb-20130301-signed/system/tts/lang_pico/es-ES_ta.bin:system/tts/lang_pico/es-ES_ta.bin ignored.
PRODUCT_COPY_FILES device/softwinner/wing-common/googleservice/gapps-jb-20130301-signed/system/tts/lang_pico/it-IT_cm0_sg.bin:system/tts/lang_pico/it-IT_cm0_sg.bin ignored.
build/core/Makefile:32: 警告:覆盖关于目标“out/target/product/sugar-cubieboard2/system/lib/libjni_latinime.so”的命令
build/core/base_rules.mk:502: 警告:忽略关于目标“out/target/product/sugar-cubieboard2/system/lib/libjni_latinime.so”的旧命令
build/core/Makefile:32: 警告:覆盖关于目标“out/target/product/sugar-cubieboard2/system/app/cb2-test.apk”的命令
build/core/base_rules.mk:502: 警告:忽略关于目标“out/target/product/sugar-cubieboard2/system/app/cb2-test.apk”的旧命令
build/core/Makefile:32: 警告:覆盖关于目标“out/target/product/sugar-cubieboard2/system/lib/libreference-ril.so”的命令
build/core/base_rules.mk:502: 警告:忽略关于目标“out/target/product/sugar-cubieboard2/system/lib/libreference-ril.so”的旧命令
PRODUCT_COPY_FILES frameworks/native/data/etc/android.hardware.wifi.direct.xml:system/etc/permissions/android.hardware.wifi.direct.xml ignored.
No private recovery resources for TARGET_DEVICE sugar-cubieboard2
Import includes file: out/target/product/sugar-cubieboard2/obj/SHARED_LIBRARIES/libled_jni_intermediates/import_includes
make: 放弃循环依赖 .so <- .so 。
make: 放弃循环依赖 .so <- out/target/product/sugar-cubieboard2/symbols/system/lib/libled_jni 。
make: 放弃循环依赖 .so <- .so 。
Export includes file: frameworks/base/cmds/system_server/library/Android.mk -- out/target/product/sugar-cubieboard2/obj/SHARED_LIBRARIES/libled_jni_intermediates/export_includes
target thumb C++: libled_jni <= frameworks/base/cmds/system_server/library/led_jni.cpp
frameworks/base/cmds/system_server/library/led_jni.cpp:35:21: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
target SharedLib: libled_jni (out/target/product/sugar-cubieboard2/obj/SHARED_LIBRARIES/libled_jni_intermediates/LINKED/libled_jni)
/work/le/a20-android/android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/../lib/gcc/arm-linux-androideabi/4.6.x-google/../../../../arm-linux-androideabi/bin/ld: out/target/product/sugar-cubieboard2/obj/SHARED_LIBRARIES/libled_jni_intermediates/led_jni.o: in function led_offNative(_JNIEnv*, _jobject*, int):frameworks/base/cmds/system_server/library/led_jni.cpp:74: error: undefined reference to '__android_log_print'
/work/le/a20-android/android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/../lib/gcc/arm-linux-androideabi/4.6.x-google/../../../../arm-linux-androideabi/bin/ld: out/target/product/sugar-cubieboard2/obj/SHARED_LIBRARIES/libled_jni_intermediates/led_jni.o: in function led_onNative(_JNIEnv*, _jobject*, int):frameworks/base/cmds/system_server/library/led_jni.cpp:65: error: undefined reference to '__android_log_print'
/work/le/a20-android/android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/../lib/gcc/arm-linux-androideabi/4.6.x-google/../../../../arm-linux-androideabi/bin/ld: out/target/product/sugar-cubieboard2/obj/SHARED_LIBRARIES/libled_jni_intermediates/led_jni.o: in function JNI_OnLoad:frameworks/base/cmds/system_server/library/led_jni.cpp:119: error: undefined reference to '__android_log_print'
/work/le/a20-android/android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/../lib/gcc/arm-linux-androideabi/4.6.x-google/../../../../arm-linux-androideabi/bin/ld: out/target/product/sugar-cubieboard2/obj/SHARED_LIBRARIES/libled_jni_intermediates/led_jni.o: in function JNI_OnLoad:frameworks/base/cmds/system_server/library/led_jni.cpp:123: error: undefined reference to '__android_log_print'
collect2: ld returned 1 exit status
make: *** [out/target/product/sugar-cubieboard2/obj/SHARED_LIBRARIES/libled_jni_intermediates/LINKED/libled_jni] 错误 1

另外,Eclipse上的java代码是不是也放在SDK上编译
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-14 17:19:10 | 显示全部楼层
jiangdou 发表于 2015-3-14 16:05
led_jni.cpp是在android的SDK里编译的

有android.mk

姜工,如果要写一个与平台无关的apk实现点灯,即只要led内部是标准的就可以实现点灯,这样就需要一个公共的接口,这个接口是哪个?
回复 支持 反对

使用道具 举报

发表于 2015-3-14 18:10:45 | 显示全部楼层
本帖最后由 jiangdou 于 2015-3-14 18:19 编辑

难弄,gpio的驱动因个而异,,大部分/sys/class/gpio  


echo xxx> /sys/class/gpio/export    //xxx 为gpio端口号
echo in/out > /sys/class/gpio/gpio_xxx/direction



例如rk3188
  1. #! /system/bin/sh

  2. #add for run bf3005_test !!!!!
  3. BUF=
  4. ZERO="0"
  5. echo 199 > /sys/class/gpio/export
  6. echo in > /sys/class/gpio/gpio199/direction
  7. run_teat_bf3005()
  8. {
  9.         echo "test bf3005....!!"
  10.         lcd_bf300
  11. }
  12. cat_gpio1_pa7()
  13. {
  14.         BUF=`cat /sys/class/gpio/gpio199/value`
  15.         if [ "$BUF" == "$ZERO" ]; then
  16.         run_teat_bf3005
  17.         fi

  18.         return 0
  19. }

  20. cat_gpio1_pa7
  21. #/system/bin/lcd_bf300

  22. exit
复制代码

回复 支持 反对

使用道具 举报

发表于 2015-3-14 18:14:02 | 显示全部楼层
本帖最后由 jiangdou 于 2015-3-14 18:53 编辑
蓝天-彭 发表于 2015-3-14 16:24
嗯,我是放在android SDK上编译的,在SDK android目录下执行:
le@le:/work/le/a20-android/android$ make ...

/work/le/a20-android/android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/../lib/gcc/arm-linux-androideabi/4.6.x-google/../../../../arm-linux-androideabi/bin/ld: out/target/product/sugar-cubieboard2/obj/SHARED_LIBRARIES/libled_jni_intermediates/led_jni.o: in function JNI_OnLoad:frameworks/base/cmds/system_server/library/led_jni.cpp:123: error: undefined reference to '__android_log_print'


//
//加头文件
#include <android/log.h>

android.mk

LOCAL_SHARED_LIBRARIES := liblog libcutils


//或者注释掉这行试试

回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 04:49 , Processed in 0.028019 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部