天嵌 ARM开发社区

 找回密码
 注册
查看: 4168|回复: 10

關於led應用程式開發led.tq210.so文件

[复制链接]
liola 发表于 2013-10-30 16:57:31 | 显示全部楼层 |阅读模式
本帖最后由 liola 于 2013-10-31 14:36 编辑

請問在學習led應用程式開發時,驅動沒有改變,板子上本來就有驅動,開始做應用程式,照著手冊步驟做HAL層
中間其實直接用複製的也沒有改任何程式碼,只是想試過一次看看,
也有把
device/embedsky/tq210/device.mk的第40行刪掉,
mmm完畢後,把led.tq210.so放進記憶卡中,裝到板子上,

把檔案複製到system/lib/hw/裡面,然後打開原本的led軟件
卻出現↓

是不可以這樣直接換掉so檔嗎?還是有別的我沒做到的?

本帖子中包含更多资源

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

x
wbz073 发表于 2013-10-30 17:26:07 | 显示全部楼层
你换掉之后重启了没,你不重启,没有生效的
 楼主| liola 发表于 2013-10-30 18:36:47 | 显示全部楼层
本帖最后由 liola 于 2013-10-30 18:40 编辑
wbz073 发表于 2013-10-30 17:26
你换掉之后重启了没,你不重启,没有生效的

有!我重啟超多次的!
有沒有哪邊可以打印一些運行的log之類的
我複製上來給你們看,可能比較好查
wbz073 发表于 2013-10-30 22:14:42 | 显示全部楼层
liola 发表于 2013-10-30 18:36
有!我重啟超多次的!
有沒有哪邊可以打印一些運行的log之類的
我複製上來給你們看, ...

你在终端logcat,就能看到信息了
 楼主| liola 发表于 2013-10-30 23:02:20 | 显示全部楼层
本帖最后由 liola 于 2013-10-31 00:17 编辑
wbz073 发表于 2013-10-30 22:14
你在终端logcat,就能看到信息了

終端logcat?
我在eclips看到這個!
adb logcat看起來好像也差不多是這樣!
這是led從app打開到按下退出鍵的信息!

10-30 22:57:23.004: I/ActivityManager(2250): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.embedsky.led/.LedActivity bnds=[223,155][336,234]} from pid 2581
10-30 22:57:23.234: D/OpenGLRenderer(2581): Flushing caches (mode 1)
10-30 22:57:23.259: D/OpenGLRenderer(2581): Flushing caches (mode 0)
10-30 22:57:23.394: I/ActivityManager(2250): Displayed com.embedsky.led/.LedActivity: +343ms
10-30 22:57:24.109: D/dalvikvm(2581): GC_CONCURRENT freed 939K, 14% free 9825K/11335K, paused 2ms+4ms
10-30 22:57:29.609: D/OpenGLRenderer(3297): Flushing caches (mode 0)
10-30 22:57:30.139: D/OpenGLRenderer(3297): Flushing caches (mode 1)
10-30 22:57:30.194: D/dalvikvm(3297): GC_EXPLICIT freed 188K, 4% free 7085K/7367K, paused 16ms+3ms
10-30 22:57:30.199: E/StrictMode(3297): class com.embedsky.led.LedActivity; instances=2; limit=1
10-30 22:57:30.199: E/StrictMode(3297): android.os.StrictMode$InstanceCountViolation: class com.embedsky.led.LedActivity; instances=2; limit=1
10-30 22:57:30.199: E/StrictMode(3297):         at android.os.StrictMode.setClassInstanceLimit(StrictMode.java:1)

這樣有用嗎?
其實好像跟正常打開的時候一樣...
正常啟動是這樣
ActivityManager( 2252): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.embedsky.led/.LedActivity bnds=[223,155][336,234]} from pid 2571
D/OpenGLRenderer( 2571): Flushing caches (mode 1)
I/ActivityManager( 2252): Displayed com.embedsky.led/.LedActivity: +272ms
D/OpenGLRenderer( 2571): Flushing caches (mode 0)
D/OpenGLRenderer( 3262): Flushing caches (mode 0)
D/OpenGLRenderer( 3262): Flushing caches (mode 1)
D/dalvikvm( 3262): GC_EXPLICIT freed 142K, 4% free 7071K/7303K, paused 12ms+3ms
E/StrictMode( 3262): class com.embedsky.led.LedActivity; instances=2; limit=1
E/StrictMode( 3262): android.os.StrictMode$InstanceCountViolation: class com.embedsky.led.LedActivity; instances=2; limit=1
E/StrictMode( 3262):         at android.os.StrictMode.setClassInstanceLimit(StrictMode.java:1)


如果是在minicom看的話
正常開啟是會顯示led opened
關閉會顯示TQ210 LEDs driver successfully close
我如果換掉led.tq210.so的話
就什麼都不會顯示...

TQ-lkp 发表于 2013-10-31 12:10:52 | 显示全部楼层
你贴的日志没有抓住重点,失败的时候logcat会有出错信息的,另外把你改的hal层的代码贴上来看下
 楼主| liola 发表于 2013-10-31 14:31:19 | 显示全部楼层
本帖最后由 liola 于 2013-10-31 14:40 编辑
TQ-lkp 发表于 2013-10-31 12:10
你贴的日志没有抓住重点,失败的时候logcat会有出错信息的,另外把你改的hal层的代码贴上来看下

現在問題更大了...
想說重新安裝APP看看有什麼改善,
把系統原本的LED APP刪掉,
裝上剛編譯的APK,(app層也是直接用ECLIPS開已存在工程)
結果從此一直出現

LOG顯示
I/ActivityManager( 2250): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.embedsky.led/.LedActivity} from pid 2567
D/dalvikvm( 2250): GC_FOR_ALLOC freed 289K, 11% free 9716K/10823K, paused 38ms
D/dalvikvm( 4369): Not late-enabling CheckJNI (already on)
I/ActivityManager( 2250): Start proc com.embedsky.led for activity com.embedsky.led/.LedActivity: pid=4369 uid=10010 gids={}
I/dalvikvm( 4369): Turning on JNI app bug workarounds for target SDK version 10...
W/dalvikvm( 4369): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/embedsky/led/LedActivity;
W/dalvikvm( 4369): Class init failed in newInstance call (Lcom/embedsky/led/LedActivity;)
D/AndroidRuntime( 4369): Shutting down VM
W/dalvikvm( 4369): threadid=1: thread exiting with uncaught exception (group=0x40a2d1f8)
D/OpenGLRenderer( 2567): Flushing caches (mode 1)
E/AndroidRuntime( 4369): FATAL EXCEPTION: main
E/AndroidRuntime( 4369): java.lang.ExceptionInInitializerError
E/AndroidRuntime( 4369):     at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime( 4369):     at java.lang.Class.newInstance(Class.java:1319)
E/AndroidRuntime( 4369):     at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
E/AndroidRuntime( 4369):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1871)
E/AndroidRuntime( 4369):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
E/AndroidRuntime( 4369):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
E/AndroidRuntime( 4369):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
E/AndroidRuntime( 4369):     at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 4369):     at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 4369):     at android.app.ActivityThread.main(ActivityThread.java:4424)
E/AndroidRuntime( 4369):     at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 4369):     at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 4369):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/AndroidRuntime( 4369):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/AndroidRuntime( 4369):     at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 4369): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load led: findLibrary returned null
E/AndroidRuntime( 4369):     at java.lang.Runtime.loadLibrary(Runtime.java:365)
E/AndroidRuntime( 4369):     at java.lang.System.loadLibrary(System.java:535)
E/AndroidRuntime( 4369):     at com.embedsky.led.LedActivity.<clinit>(LedActivity.java:16)
E/AndroidRuntime( 4369):     ... 15 more
W/ActivityManager( 2250):   Force finishing activity com.embedsky.led/.LedActivity
D/OpenGLRenderer( 2567): Flushing caches (mode 0)
I/Process ( 2250): Sending signal. PID: 4369 SIG: 3
I/dalvikvm( 4369): threadid=3: reacting to signal 3
I/dalvikvm( 4369): Wrote stack traces to '/data/anr/traces.txt'
W/ActivityManager( 2250): Activity pause timeout for ActivityRecord{413040b8 com.embedsky.led/.LedActivity}
I/Process ( 2250): Sending signal. PID: 4369 SIG: 3
I/dalvikvm( 4369): threadid=3: reacting to signal 3
I/dalvikvm( 4369): Wrote stack traces to '/data/anr/traces.txt'
I/Process ( 4369): Sending signal. PID: 4369 SIG: 9
W/InputManagerService( 2250): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@4139e520
I/ActivityManager( 2250): Process com.embedsky.led (pid 4369) has died.
W/ActivityManager( 2250): Activity destroy timeout for ActivityRecord{413040b8 com.embedsky.led/.LedActivity}



HAL層代碼的話,我是直接從光碟複製到手冊說的位置
完全沒有改~
貼上來有把最上面的備註拿掉
------------------------------------------------------------------------------------------------------------------------------------------------------------
這是led.h
#ifndef ANDROID_LED_INTERFACE_H
#define ANDROID_LED_INTERFACE_H

#include <stdint.h>
#include <sys/cdefs.h>
#include <sys/types.h>

#include <hardware/hardware.h>

__BEGIN_DECLS

/**
* The id of this module
*/
#define LED_HARDWARE_MODULE_ID "led"
struct led_module_t
{
    struct hw_module_t common;
};

/* 应用程序执行ioctl(fd, cmd, arg)时的第2个参数 */
#define IOCTL_GPIO_ON    1
#define IOCTL_GPIO_OFF    0

/* 应用程序执行ioctl(fd, cmd, arg)时的第3个参数 */
#define LED_NUMBER1    1
#define LED_NUMBER2    2

struct led_control_device_t {
    struct hw_device_t common;

    int (*set_on)(struct led_control_device_t* dev,
            int32_t number);
    int (*set_off)(struct led_control_device_t* dev,
                int32_t number);
};
__END_DECLS

#endif  // ANDROID_LED_INTERFACE_H

-----------------------------------------------------------------------------------------------------------------------------------------------------------------
再來是led.c
#define LOG_TAG "led"
#include <cutils/log.h>
#include <stdint.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <hardware/led.h>

char const * const LED_DEVICE = "/dev/led";
static int fd = -1;

static int open_led() {
    if ((fd = open(LED_DEVICE, O_RDWR)) == -1) {
        LOGV("open %s fail\n", LED_DEVICE);
        return -1;
    }
    LOGV("led_open success\n");
    return 1;
}

static int close_led(struct hw_device_t *dev) {
    LOGV("close_light is called");
    if (fd != -1) {
        close(fd);
        fd = -1;
        if (dev)
            free(dev);
    }
    return 0;
}
int led_on(struct led_control_device_t* dev, int32_t number) {

    if (fd == -1)
        return -1;

    return ioctl(fd, IOCTL_GPIO_ON, number);
}

int led_off(struct led_control_device_t* dev, int32_t number) {
    if (fd == -1)
        return -1;
    return ioctl(fd, IOCTL_GPIO_OFF, number);
}

static int led_init(const struct hw_module_t *module, char const *name,
        struct hw_device_t **device) {

    struct led_control_device_t *dev;
    dev = (struct led_control_device_t *) malloc(
            sizeof(struct led_control_device_t));

    if (dev == NULL)
        return 0;

    memset(dev, 0, sizeof(*dev));
    dev->common.tag = HARDWARE_DEVICE_TAG;
    dev->common.version = 0;
    dev->common.module =  module;
    dev->common.close = (int (*)(struct hw_device_t *)) close_led;
    *device = (struct hw_device_t *) &dev->common;

    dev->set_on = led_on;
    dev->set_off = led_off;

    if (open_led() == -1) {
        free(dev);
        dev = NULL;
        return -1;
    }
    return 0;
}

static struct hw_module_methods_t led_module_methods = {
        open : led_init
};

const struct led_module_t HAL_MODULE_INFO_SYM =
{
    common:
    {
        tag: HARDWARE_MODULE_TAG,
        version_major: 1,
        version_minor: 0,
        id: LED_HARDWARE_MODULE_ID,
        name: "led Stub",
        author: "embedsky",
        methods: &led_module_methods,
    }

};
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
最後android.mk
LOCAL_PATH:= $(call my-dir)
# HAL module implemenation, not prelinked and stored in
# hw/<COPYPIX_HARDWARE_MODULE_ID>.<ro.board.platform>.so
include $(CLEAR_VARS)
LOCAL_PRELINK_MODULE := false
LOCAL_SRC_FILES := led.c

LOCAL_MODULE := led.$(TARGET_BOARD_PLATFORM)
LOCAL_MODULE_TAGS := optional
#LOCAL_MODULE := libled

LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw

include $(BUILD_SHARED_LIBRARY)

本帖子中包含更多资源

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

x
TQ-lkp 发表于 2013-11-5 10:33:11 | 显示全部楼层
报的错是找不到库,你是不是mmm后,没有将生成的库拷贝到文件系统目录下
 楼主| liola 发表于 2013-11-8 10:42:42 | 显示全部楼层
TQ-lkp 发表于 2013-11-5 10:33
报的错是找不到库,你是不是mmm后,没有将生成的库拷贝到文件系统目录下

有拷貝過去,替換掉原本的,
就算沒拷貝過去,也有原本的,
所以他找不到庫可能有別的原因...
moonswift 发表于 2014-3-5 15:34:28 | 显示全部楼层
会不会是拷过去文件的权限原因?
nuu9323226 发表于 2014-7-25 18:16:07 | 显示全部楼层
修改led driver

在tq210_gpio_open中取消return err就不會造成意外結束,修改如下

static int tq210_gpio_open(struct inode *inode, struct file *file)
{
        int i;
        int err;
        err = gpio_request(gpio_table[0], "GPC0_3");
        if(err)
        {
                printk(KERN_ERR "failed to request GPC0_3 for LVDS PWDN pin\n");
                printk("err:%d \n",err);
        //return err; 取消結束,避免造成app執行失敗
        }
        err = gpio_request(gpio_table[1], "GPC0_4");
        if(err)
        {
                printk(KERN_ERR "failed to request GPC0_4 for LVDS PWDN pin\n");
                printk("err:%d \n",err);
        //return err; 取消結束,避免造成app執行失敗
        }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-6-17 05:06 , Processed in 1.031250 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表