linux上hid设备,linux上hid设备读写的有关问题

当前位置:我的异常网» Linux/Unix » linux上hid设备读写的有关问题

linux上hid设备读写的有关问题

www.myexceptions.net  网友分享于:2013-12-31  浏览:175次

linux下hid设备读写的问题

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

int main(int argc,char **argv)

{

int fd;

int rtn,ret=0;

int i,j=0;

struct hiddev_report_info rinfo;

struct hiddev_usage_ref uref;

struct hiddev_field_info finfo;

struct hiddev_usage_ref_multi urefs;

struct hiddev_devinfo dinfo;

struct hiddev_collection_info cinfo;

unsigned char bufw[21]={0x02,0x08,0xce,0,0,0,0,0,0,0};

unsigned char recv[21]={0};

//printf("argc = %d\n",argc);

//打开设备文件

fd=open("/dev/usb/hiddev0",O_RDWR);

if(fd > 0)

{

printf("open hid success!,fd = %d\n",fd);

}

//

rinfo.report_type=HID_REPORT_TYPE_OUTPUT;

rinfo.report_id=HID_REPORT_ID_FIRST;

ret=ioctl(fd,HIDIOCGREPORTINFO,&rinfo);

if(ret != 0)

{

printf("ioctl one failed!\n");

close(fd);

return -1;

}

for(i=0;i

{

finfo.report_type=rinfo.report_type;

finfo.report_id=rinfo.report_id;

finfo.field_index=i;

ret = ioctl(fd,HIDIOCGFIELDINFO,&finfo);

printf("finfo.maxusage %d\n",finfo.maxusage);

if(ret != 0)

{

printf("ioctl two failed\n");

close(fd);

return -1;

}

//for(j=0;j

//{

uref.report_type=finfo.report_type;

uref.report_id=finfo.report_id;

uref.field_index=i;

uref.usage_index=j;//ioctl(fd,HIDIOCGUCODE,&uref);

ret = ioctl(fd,HIDIOCGUSAGE,&uref);

if(ret != 0)

{

printf("ioctl three faile!\n");

close(fd);

return -1;

}

ret = ioctl(fd,HIDIOCGUCODE,&uref);

printf("usage.value:%x\n",uref.value);

printf("usage report_type %d report_id %d field_index %d usage_index %d usage_code %d\n",

uref.report_type, uref.report_id, uref.field_index, uref.usage_index, uref.usage_code);

if(ret != 0)

{

printf("ioctl four failed\n");

close(fd);

return -1;

}

printf("\n");

//}

urefs.uref.report_type=HID_REPORT_TYPE_OUTPUT;

urefs.uref.report_id=finfo.report_id;

urefs.num_values=8;

urefs.uref.field_index=i;

urefs.uref.usage_index=0;

for(j=0;j<21;j++)

{

urefs.uref.usage_code+=4;

urefs.values[j]=bufw[j];

printf("usage report_type:%d,report_id:%d,field_index:%d,usage_index:%d,usage_code:%d\n", urefs.uref.report_id,urefs.uref.report_id,urefs.uref.field_index,urefs.uref.usage_index, urefs.uref.usage_code);

}

ret=ioctl(fd,HIDIOCSUSAGES,&urefs);//写入数据1

if(ret !=0)

{

printf("failed !\n");

close(fd);

return -1;

}

}

rinfo.report_type=HID_REPORT_TYPE_INPUT;

rinfo.report_id=HID_REPORT_ID_FIRST;

for(i=0;i

{

printf("num_field=%d\n",rinfo.num_fields);

finfo.report_type=rinfo.report_type;

finfo.report_id=rinfo.report_id;

finfo.field_index=i;

printf("finfo.report_id:%d\n",finfo.report_id);

ret =ioctl(fd,HIDIOCGFIELDINFO,&finfo);

if(ret !=0)

{

printf("ioctl five faile!\n");

close(fd);

return -1;

}

else

{

printf("finfo.report_id:%d\n",finfo.report_id);

}

}

for(i=0;i<21;i++)//打印结构体中是否有值。运行之后显示正确

文章评论

Linux中实现读写HID模拟鼠标可以通过以下步骤来完成: 1. 首先,需要使用hidraw设备读写HID设备HID设备Linux中通常以hidraw设备的形式出现。可以通过以下命令查看系统中的hidraw设备: ```shell ls /dev/hidraw* ``` 2. 打开hidraw设备以进行读写操作。可以使用C语言编写一个程序来打开hidraw设备,并使用read和write函数来读写数据。以下是一个简单的示例程序: ```c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <linux/hidraw.h> int main() { int fd; char buf[8]; fd = open("/dev/hidraw0", O_RDWR); if (fd < 0) { perror("Unable to open hidraw device"); exit(1); } // 读取数据 if (read(fd, buf, sizeof(buf)) < 0) { perror("Unable to read from hidraw device"); exit(1); } // 写入数据 if (write(fd, buf, sizeof(buf)) < 0) { perror("Unable to write to hidraw device"); exit(1); } close(fd); return 0; } ``` 3. 解析HID报文。HID报文通常是由一系列的字节组成的。根据HID规范,可以解析报文中的每个字节来获取鼠标的相关信息,例如鼠标的坐标、按键状态等。 4. 模拟鼠标操作。根据解析得到的鼠标信息,可以使用X11或者uinput来模拟鼠标操作。X11是Linux下的图形系统,可以使用XTest库来模拟鼠标操作。uinput是Linux内核提供的一个虚拟输入设备接口,可以使用uinput库来模拟鼠标操作。 以下是一个使用XTest库来模拟鼠标操作的示例程序: ```c #include <stdio.h> #include <X11/Xlib.h> #include <X11/extensions/XTest.h> int main() { Display *display; Window root; XEvent event; display = XOpenDisplay(NULL); if (display == NULL) { fprintf(stderr, "Unable to open display\n"); return 1; } root = DefaultRootWindow(display); // 模拟鼠标移动 XTestFakeMotionEvent(display, -1, 100, 100, CurrentTime); // 模拟鼠标点击 XTestFakeButtonEvent(display, 1, True, CurrentTime); XTestFakeButtonEvent(display, 1, False, CurrentTime); XFlush(display); XCloseDisplay(display); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值