谢谢斑竹~~~
1. 驱动里的leds_open()添加了printk(),没打印信息处理,感觉没被调用到,而该程序里的init部分则有调试信息出来。
2.我是在android系统上写了一个java应用调用jni的**.so,然后在调用HAL的 **.so,HAL里的.so源代码就是用到上述老是返回-1的open函数,HAL里的.so我放在hardware/libhardware/modules/led/下的!logcat看出java的apk已经调用到jni的.so,也进入了HAL里的.so就是在运行到HAL的led.c里的open时出错,我也添加了perror可打印不出该信息!!!
附上HAL里的led.c源码:
/***********led.c******* **/
//***/hardwar/modules/led/***/
#define LOG_TAG "LedStub"
#include <cutils/log.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <hardware/led.h>
#define LED_DEVICE "/dev/led"
#define IOCTL_LED0_ON 0
#define IOCTL_LED1_ON 1
#define IOCTL_LED0_OFF 2
#define IOCTL_LED1_OFF 3
static int led_set_on(struct led_control_device_t *dev,int32_t led)
{
//FIXME: do system call to control gpio led
int fd;
LOGI("LED Stub: set %d on.\r\n",led);
fd=dev->fd;
switch(led)
{
case IOCTL_LED0_ON :
ioctl(fd,0,0);
break;
case IOCTL_LED1_ON :
ioctl(fd,1,0);
break;
default: return -1;
}
LOGI("led_set_on\r\n");
return 0;
}
static int led_set_off(struct led_control_device_t *dev,int32_t led)
{
int fd;
LOGI("LED Stub: set %d off.\r\n",led);
fd=dev->fd;
switch(led)
{
case IOCTL_LED0_OFF :
LOGI("LED Stub: set IOCTL_LED0_OFF.\r\n");
ioctl(fd,2,0);
break;
case IOCTL_LED1_ON :
LOGI("LED Stub: set IOCTL_LED1_ON .\r\n");
ioctl(fd,3,0);
break;
default: return -1;
}
LOGI("led_set_off\r\n");
return 0;
}
static int led_device_close(struct led_control_device_t *dev)
{
close(dev->fd);
if (dev)
{
free(dev);
}
return 0;
}
static int led_device_open(const struct hw_module_t *module, const char *name ,struct hw_device_t **device)
{
struct led_control_device_t *dev;
dev = (struct led_control_device_t *)malloc(sizeof(*dev));
memset(dev,0,sizeof(*dev));
dev->common.tag = HARDWARE_DEVICE_TAG;
dev->common.version =0;
dev->common.module =(struct hw_module_t*)(module);
dev->common.close =led_device_close;
dev->set_on =led_set_on;
dev->set_off =led_set_off;
*device =&dev->common;
dev->fd =open("/dev/led",O_RDWR); #define LED_DEVICE "/dev/leds"
LOGI("**led.c-->led_device_open 2 fd=%d",dev->fd); ////该句子打印出来了,fd=-1
if(dev->fd < 0)
{
LOGI("**\r\nprint perror:"); //该句子打印出来了
perror("/dev/led"); //该句信息没打印出来
LOGI("** print_end\r\n"); //该句子打印出来了
return -1;
}
led_set_on(dev,IOCTL_LED0_ON);
led_set_on(dev,IOCTL_LED1_ON);
success:
return 0;
}
static struct hw_module_methods_t led_module_methods ={
open:led_device_open
};
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:"Sample LED Stub",
author:"LWJ Open Source Project",
methods:&led_module_methods,
}
};