您的位置:首页 > 移动开发 > Android开发

android下面通过ndk建立一个虚拟触摸屏设备可以被sendevent调用

2016-11-21 19:25 1346 查看
如何创建

如何使用

如何编译

1 如何创建

#define LOG_TAG "shinevitualdevice"
#if 0
#include <utils/Log.h>
#endif

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
#include <linux/uinput.h>
#include <time.h>
#include <sys/time.h>

#define LOGE printf

// Globals
static int uinp_fd = -1;
static int uinp_acc_fd = -1;
static int uinp_ori_fd = -1;

// Setup the uInput device
static int setup_uinput_device()
{
struct uinput_user_dev uinp; // uInput device structure
int i;

// Open the input device
uinp_fd = open("/dev/uinput", O_WRONLY | O_NDELAY);
if (uinp_fd == 0) {
LOGE("Unable to open /dev/uinput\n");
return -1;
}

// Intialize the uInput device to NULL
memset(&uinp, 0x00, sizeof(uinp));
strncpy(uinp.name, "ShineVirtualInputReceiver", sizeof(uinp.name)-1);
uinp.id.vendor = 0x3697;
uinp.id.product = 0x0003;//对应/system/usr/idc/Vendor_3697_Product_0003.idc   //0x0010;
uinp.id.bustype = BUS_VIRTUAL;

// Setup the uInput device (Keyboard + Cursor + Single-touch + Multi-touch)
ioctl(uinp_fd, UI_SET_EVBIT, EV_KEY);
ioctl(uinp_fd, UI_SET_EVBIT, EV_REL);
ioctl(uinp_fd, UI_SET_EVBIT, EV_ABS);

ioctl(uinp_fd, UI_SET_KEYBIT, KEY_POWER);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_MUTE);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_SLEEP);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_AUDIO);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_CAMERA);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_ZOOM);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_CHANNEL);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_0);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_1);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_2);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_3);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_4);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_5);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_6);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_7);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_8);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_9);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_RED);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_GREEN);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_YELLOW);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_BLUE);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_MENU);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_BACK);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_EPG);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_UP);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_DOWN);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_LEFT);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_RIGHT);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_ENTER);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_CHANNELUP);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_CHANNELDOWN);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_VOLUMEUP);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_VOLUMEDOWN);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_PAGEUP);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_PAGEDOWN);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_HOME);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_SUBTITLE);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_RECORD);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_HELP);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_INFO);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_LIST);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_REWIND);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_FORWARD);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_PREVIOUSSONG);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_NEXTSONG);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_PLAY);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_PAUSE);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_STOP);
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_FN_F1); // MTS
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_FN_F2); // FREEZE
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_FN_F3); // TTX
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_FN_F4); // CC
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_FN_F5); // WINDOW
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_FN_F6); // TV_INPUT
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F1); // MSTAR_BALANCE
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F2); // MSTAR_END
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F3); // MSTAR_INDEX
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F4); // MSTAR_MIX
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F5); // MSTAR_HOLD
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F6); // MSTAR_UPDATE
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F7); // MSTAR_REVEAL
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F8); // MSTAR_SUBCODE
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F9); // MSTAR_SIZE
ioctl(uinp_fd, UI_SET_KEYBIT, KEY_F10); // MSTAR_CLOCK
ioctl(uinp_fd, UI_SET_KEYBIT, BTN_MOUSE);
ioctl(uinp_fd, UI_SET_KEYBIT, BTN_TOUCH);

ioctl(uinp_fd, UI_SET_RELBIT, REL_X);
ioctl(uinp_fd, UI_SET_RELBIT, REL_Y);

ioctl(uinp_fd, UI_SET_ABSBIT, ABS_X);
ioctl(uinp_fd, UI_SET_ABSBIT, ABS_Y);
ioctl(uinp_fd, UI_SET_ABSBIT, ABS_MT_POSITION_X);
ioctl(uinp_fd, UI_SET_ABSBIT, ABS_MT_POSITION_Y);

// Single-touch
uinp.absmin[ABS_X] = 0;
uinp.absmax[ABS_X] = 1920;
uinp.absfuzz[ABS_X] = 0;
uinp.absflat[ABS_X] = 0;
uinp.absmin[ABS_Y] = 0;
uinp.absmax[ABS_Y] = 1080;
uinp.absfuzz[ABS_Y] = 0;
uinp.absflat[ABS_Y] = 0;
// Multi-touch
uinp.absmin[ABS_MT_POSITION_X] = 0;
uinp.absmax[ABS_MT_POSITION_X] = 1920;
uinp.absfuzz[ABS_MT_POSITION_X] = 4;
uinp.absflat[ABS_MT_POSITION_X] = 8;
uinp.absmin[ABS_MT_POSITION_Y] = 0;
uinp.absmax[ABS_MT_POSITION_Y] = 1080;
uinp.absfuzz[ABS_MT_POSITION_Y] = 4;
uinp.absflat[ABS_MT_POSITION_Y] = 8;

// Create input device into input sub-system
if (write(uinp_fd, &uinp, sizeof(uinp)) != sizeof(uinp)) {
LOGE("First write returned fail.\n");
return -1;
}

if (ioctl(uinp_fd, UI_DEV_CREATE)) {
LOGE("ioctl UI_DEV_CREATE returned fail.\n");
return -1;
}

return 1;
}


static int setup_shine_uinput_device(void)
{
if (setup_uinput_device() < 0) {
LOGE("Unable to find uInput device\n");
return -1;
}

return 0;
}


2 如何使用

#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <android/log.h>
#include <unistd.h>
#include  "jni.h"
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

#define CURRENT_ENCODE "GBK"
#define CURRENT_ENCODE_Q "UTF-8"
int g_nMode = 1;//write

//0: 0x1130, 0x0015);//TouchScreen 22cun
//1: 0x265f, 0x0005);//TouchScreen 18.5cun
//2: VID 23A4 0219  MingTai cardReader 2in1
unsigned int g_unTouchScreenVidPIdArray[16];//
unsigned int g_unTouchScreenCurVidPid = 0;

enum {
MODE_INIT = 0x00,
MODE_AWAIT_FINGER_ON = 0x10,
MODE_AWAIT_FINGER_OFF = 0x12,
MODE_CAPTURE = 0x20,
MODE_SHUT_UP = 0x30,
MODE_READY = 0x80,
};

enum {
STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_ON = 1,
STATE_AWAIT_IRQ_FINGER_DETECTED,
STATE_AWAIT_MODE_CHANGE_CAPTURE,
STATE_AWAIT_IMAGE,
STATE_AWAIT_MODE_CHANGE_AWAIT_FINGER_OFF,
STATE_AWAIT_IRQ_FINGER_REMOVED,
};

#if 1//20120807 byh
#define covert(c1,c2) (unsigned int)((c1<<8)|(c2))
#else
#define covert(c1,c2) (unsigned short)((c1<<8)|(c2))
#endif

//#include <stdio.h>
//#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/ioctl.h>
//#include <linux/input.h> // this does not compile
#include <errno.h>

// from <linux/input.h>
#if 0
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
int value;
};
#endif

#define EVIOCGVERSION       _IOR('E', 0x01, int)            /* get driver version */
#define EVIOCGID        _IOR('E', 0x02, struct input_id)    /* get device ID */
#define EVIOCGKEYCODE       _IOR('E', 0x04, int[2])         /* get keycode */
#define EVIOCSKEYCODE       _IOW('E', 0x04, int[2])         /* set keycode */

#define EVIOCGNAME(len)     _IOC(_IOC_READ, 'E', 0x06, len)     /* get device name */
#define EVIOCGPHYS(len)     _IOC(_IOC_READ, 'E', 0x07, len)     /* get physical location */
#define EVIOCGUNIQ(len)     _IOC(_IOC_READ, 'E', 0x08, len)     /* get unique identifier */

#define EVIOCGKEY(len)      _IOC(_IOC_READ, 'E', 0x18, len)     /* get global keystate */
#define EVIOCGLED(len)      _IOC(_IOC_READ, 'E', 0x19, len)     /* get all LEDs */
#define EVIOCGSND(len)      _IOC(_IOC_READ, 'E', 0x1a, len)     /* get all sounds status */
#define EVIOCGSW(len)       _IOC(_IOC_READ, 'E', 0x1b, len)     /* get all switch states */

#define EVIOCGBIT(ev,len)   _IOC(_IOC_READ, 'E', 0x20 + ev, len)    /* get event bits */
#define EVIOCGABS(abs)      _IOR('E', 0x40 + abs, struct input_absinfo)     /* get abs value/limits */
#define EVIOCSABS(abs)      _IOW('E', 0xc0 + abs, struct input_absinfo)     /* set abs value/limits */

#define EVIOCSFF        _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect))   /* send a force effect to a force feedback device */
#define EVIOCRMFF       _IOW('E', 0x81, int)            /* Erase a force effect */
#define EVIOCGEFFECTS       _IOR('E', 0x84, int)            /* Report number of effects playable at the same time */

#define EVIOCGRAB       _IOW('E', 0x90, int)            /* Grab/Release device */

#define KEY_1          2
#define KEY_2           3
#define KEY_3           4
#define KEY_4           5
#define KEY_5           6
#define KEY_6           7
#define KEY_7           8
#define KEY_8           9
#define KEY_9           10
#define KEY_0           11

#define KEY_A           30

#define KEY_B           48

#define KEY_C           46
#define KEY_D           32
#define KEY_E           18
#define KEY_F           33
#define KEY_X           64
#define KEY_ENTER       28
// end <linux/input.h>

#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

/////////////////event5 begin///////////////////////////////////
#include "shineVirtualTouch.cpp"
static int g_fdEvent5 = -1;

void closeEvent5()
{
if(-1 != g_fdEvent5)
{
close(g_fdEvent5);
g_fdEvent5 = -1;
}
}

int queryShineVirtualInputReceiver()
{
int fd = -1;
char name[256]= "Unknown";
char eventname[256];

int i=0;
for(i=0;i<20;i++)
{
memset(eventname, 0, sizeof(eventname));
sprintf(eventname, "/dev/input/event%d", i);
printf("eventname is %s\n", eventname);
if ((fd = open(eventname, O_RDWR)) < 0) {
perror("evdev open");

continue;
}

memset(name, 0, sizeof(name));
if(ioctl(fd, EVIOCGNAME(sizeof(name)), name) < 0) {
perror("evdev ioctl");
}

printf("The device on %s says its name is %s\n",
eventname, name);
if(0 == strcmp(name, "ShineVirtualInputReceiver"))
{
g_fdEvent5 = fd;

int version;
if (ioctl(g_fdEvent5, EVIOCGVERSION, &version)) {
fprintf(stderr, "could not get driver version for %s, %s\n", eventname, strerror(errno));

g_fdEvent5 = -1;
return g_fdEvent5;
}

break;
}

close(fd);
}

return 0;
}

int openEvent5(char *pEventPath)
{
int version;

g_fdEvent5 = -1;
queryShineVirtualInputReceiver();
return g_fdEvent5;
}

int sendevent(struct input_event &event)
{
int ret;

static int nInit = 0;
if(0 == nInit)
{
nInit = 1;

setup_shine_uinput_device();

}

if(-1 == g_fdEvent5)
{
#if 1//20131113 byh
char *g_pEventUrl = "/dev/input/event5";
printf("before openEvent: %s\n", g_pEventUrl);
openEvent5(g_pEventUrl);
#else
printf("before openEvent5\n");
openEvent5("/dev/input/event5");
#endif
usleep(200*1000);
}

ret = write(g_fdEvent5, &event, sizeof(event));
if(ret < sizeof(event)) {
fprintf(stderr, "write event failed, %s\n", strerror(errno));
return -1;
}
return 0;
}
/////////////for sendevent end///////////////////////////

static void input_report_key(struct input_dev *dev, unsigned int code, int value)
{
//printf("input_report_key code:%d value:%d\n", code, value);
static struct input_event event;
memset(&event, 0, sizeof(event));
event.type = 1;
event.code = code;
event.value = value;
sendevent(event);
}

static void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
{
//printf("input_event type:%d code:%d value:%d\n", type, code, value);
static struct input_event event;
memset(&event, 0, sizeof(event));
event.type = type;
event.code = code;

#if 1//20140117 byh , scale at i2c recv data , do nothing
event.value = value;
#else
if(ABS_MT_POSITION_X == code)
{
event.value = (value*1920)/1280;
}
else if(ABS_MT_POSITION_Y == code)
{
event.value = (value*1080)/800;
}
else
{
event.value = value;
}
#endif
//printf("input_event type:%d code:%d value:%d event.value %d\n", type, code, value, event.value);
sendevent(event);
}

static void input_mt_sync(struct input_dev *dev)
{
//printf("input_mt_sync \n");
static struct input_event event;
memset(&event, 0, sizeof(event));
event.type = 0;
event.code = 2;
event.value = 0;
sendevent(event);
}

static void input_sync(struct input_dev *dev)
{
//printf("input_sync \n");
static struct input_event event;
memset(&event, 0, sizeof(event));
event.type = 0;
event.code = 0;
event.value = 0;
sendevent(event);
}
/////////////////event5 end///////////////////////////////////

static int irt_WLZ_SINGLE_read_data(int x, int y, int touch)
{
printf("%s(%d) :2013-06-25 irt_WLZ_SINGLE_read_data : src x %d   y %d x=%02x y=%02x  dev->touch=%d \n", __FILE__, __LINE__, x, y, touch);
struct input_dev *input = NULL;

{
if(1 == touch)
{
input_report_key(input, BTN_TOUCH,  1);//330
input_event(input, EV_ABS, ABS_MT_TRACKING_ID, 1); //57
input_event(input, EV_ABS, ABS_MT_POSITION_X, x+1);//53
input_event(input, EV_ABS, ABS_MT_POSITION_Y, y+1);//54
input_event(input, EV_ABS, ABS_MT_TOUCH_MAJOR, 1);//48
input_mt_sync(input);
input_sync(input);
}
else
{
input_report_key(input, BTN_TOUCH,  0);
input_mt_sync(input);
input_sync(input);
}

printf("%s(%d) :2013-06-25 irt_WLZ_SINGLE_read_data : src x %d   y %d x=%02x y=%02x  dev->touch=%d \n", __FILE__, __LINE__, x, y, touch);
}

return 1;
}

static int TouchScreen11300015()
{
uint16_t k;
unsigned char data[1024];
int r;
int i;
int ret = -1;

r=0;

input_sync(NULL);

memset(data, 0, sizeof(data));
//printf("i is %d\n", i);

while(1)
{
memset(data, 0, sizeof(data));

sleep(5);

//printf("recv data %d\n ",r);
for (i=0;i<32 ;i++ )
{
printf("0x%02x ",data[i]);
}
printf("ret is %d\n", ret);
irt_WLZ_SINGLE_read_data(500, 500, 1);
irt_WLZ_SINGLE_read_data(500, 500, 0);

}

return 0;
}

int main(int argc,char **argv)
{

TouchScreen11300015();

return 0;
}


3 如何编译

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_ARM_MODE := arm
#LOCAL_MODULE    := MT3Y-00-A3991UsbCard
LOCAL_MODULE    := shineVirtualTouchScreen
LOCAL_SRC_FILES := dpfp_threaded.cpp
#LOCAL_SRC_FILES := hello-jni.c dpfp_threaded1.c
#LOCAL_LDLIBS:=   -L$(LOCAL_PATH)/../../libxml2-2.9.0/obj/local/armeabi -lxml2 -L$(LOCAL_PATH)/../../hello-jni_temp/jni -lusb-1.0
LOCAL_C_INCLUDES := /home/shine/opt/android-ndk-r6b/platforms/android-9/arch-arm/usr/include    \
/home/shine/opt/android-ndk-r6b/sources/cxx-stl/stlport/stlport  ../include  $(LOCAL_PATH)/include      \
$(LOCAL_PATH)/../../com_shine_jni_zgl

LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE

LOCAL_LDLIBS:=       \
$(LOCAL_PATH)/../../../sources/cxx-stl/stlport/libs/armeabi/libstlport_static.a \
-L$(LOCAL_PATH)/../jni          -llog

include $(BUILD_EXECUTABLE)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐