h3ndrik
13 years ago
7 changed files with 332 additions and 1 deletions
Binary file not shown.
@ -0,0 +1,182 @@ |
|||
/*
|
|||
* Hidraw Userspace Example |
|||
* |
|||
* Copyright (c) 2010 Alan Ott <alan@signal11.us> |
|||
* Copyright (c) 2010 Signal 11 Software |
|||
* |
|||
* The code may be used by anyone for any purpose, |
|||
* and can serve as a starting point for developing |
|||
* applications using hidraw. |
|||
*/ |
|||
|
|||
/* Linux */ |
|||
#include <linux/types.h> |
|||
#include <linux/input.h> |
|||
#include <linux/hidraw.h> |
|||
|
|||
/*
|
|||
* Ugly hack to work around failing compilation on systems that don't |
|||
* yet populate new version of hidraw.h to userspace. |
|||
* |
|||
* If you need this, please have your distro update the kernel headers. |
|||
*/ |
|||
#ifndef HIDIOCSFEATURE |
|||
#define HIDIOCSFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len) |
|||
#define HIDIOCGFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x07, len) |
|||
#endif |
|||
|
|||
/* Unix */ |
|||
#include <sys/ioctl.h> |
|||
#include <sys/types.h> |
|||
#include <sys/stat.h> |
|||
#include <fcntl.h> |
|||
#include <unistd.h> |
|||
|
|||
/* C */ |
|||
#include <stdio.h> |
|||
#include <string.h> |
|||
#include <stdlib.h> |
|||
#include <errno.h> |
|||
|
|||
const char *bus_str(int bus); |
|||
|
|||
int main(int argc, char **argv) |
|||
{ |
|||
int fd; |
|||
int i, res, desc_size = 0; |
|||
char buf[256]; |
|||
struct hidraw_report_descriptor rpt_desc; |
|||
struct hidraw_devinfo info; |
|||
|
|||
/* Open the Device with non-blocking reads. In real life,
|
|||
don't use a hard coded path; use libudev instead. */ |
|||
fd = open("/dev/hidraw0", O_RDWR|O_NONBLOCK); |
|||
|
|||
if (fd < 0) { |
|||
perror("Unable to open device"); |
|||
return 1; |
|||
} |
|||
|
|||
memset(&rpt_desc, 0x0, sizeof(rpt_desc)); |
|||
memset(&info, 0x0, sizeof(info)); |
|||
memset(buf, 0x0, sizeof(buf)); |
|||
|
|||
/* Get Report Descriptor Size */ |
|||
res = ioctl(fd, HIDIOCGRDESCSIZE, &desc_size); |
|||
if (res < 0) |
|||
perror("HIDIOCGRDESCSIZE"); |
|||
else |
|||
printf("Report Descriptor Size: %d\n", desc_size); |
|||
|
|||
/* Get Report Descriptor */ |
|||
rpt_desc.size = desc_size; |
|||
res = ioctl(fd, HIDIOCGRDESC, &rpt_desc); |
|||
if (res < 0) { |
|||
perror("HIDIOCGRDESC"); |
|||
} else { |
|||
printf("Report Descriptor:\n"); |
|||
for (i = 0; i < rpt_desc.size; i++) |
|||
printf("%hhx ", rpt_desc.value[i]); |
|||
puts("\n"); |
|||
} |
|||
|
|||
/* Get Raw Name */ |
|||
res = ioctl(fd, HIDIOCGRAWNAME(256), buf); |
|||
if (res < 0) |
|||
perror("HIDIOCGRAWNAME"); |
|||
else |
|||
printf("Raw Name: %s\n", buf); |
|||
|
|||
/* Get Physical Location */ |
|||
res = ioctl(fd, HIDIOCGRAWPHYS(256), buf); |
|||
if (res < 0) |
|||
perror("HIDIOCGRAWPHYS"); |
|||
else |
|||
printf("Raw Phys: %s\n", buf); |
|||
|
|||
/* Get Raw Info */ |
|||
res = ioctl(fd, HIDIOCGRAWINFO, &info); |
|||
if (res < 0) { |
|||
perror("HIDIOCGRAWINFO"); |
|||
} else { |
|||
printf("Raw Info:\n"); |
|||
printf("\tbustype: %d (%s)\n", |
|||
info.bustype, bus_str(info.bustype)); |
|||
printf("\tvendor: 0x%04hx\n", info.vendor); |
|||
printf("\tproduct: 0x%04hx\n", info.product); |
|||
} |
|||
|
|||
/* Set Feature */ |
|||
// buf[0] = 0x9; /* Report Number */
|
|||
// buf[1] = 0xff;
|
|||
// buf[2] = 0xff;
|
|||
// buf[3] = 0xff;
|
|||
// res = ioctl(fd, HIDIOCSFEATURE(4), buf);
|
|||
// if (res < 0)
|
|||
// perror("HIDIOCSFEATURE");
|
|||
// else
|
|||
// printf("ioctl HIDIOCGFEATURE returned: %d\n", res);
|
|||
|
|||
/* Get Feature */ |
|||
// buf[0] = 0x9; /* Report Number */
|
|||
// res = ioctl(fd, HIDIOCGFEATURE(256), buf);
|
|||
// if (res < 0) {
|
|||
// perror("HIDIOCGFEATURE");
|
|||
// } else {
|
|||
// printf("ioctl HIDIOCGFEATURE returned: %d\n", res);
|
|||
// printf("Report data (not containing the report number):\n\t");
|
|||
// for (i = 0; i < res; i++)
|
|||
// printf("%hhx ", buf[i]);
|
|||
// puts("\n");
|
|||
// }
|
|||
|
|||
/* Send a Report to the Device */ |
|||
buf[0] = 0x0; /* Report Number */ |
|||
buf[1] = 0x00; |
|||
buf[2] = 0x01; |
|||
buf[3] = 0x00; |
|||
buf[4] = 0x00; |
|||
buf[5] = 0x01; |
|||
res = write(fd, buf, 6); |
|||
if (res < 0) { |
|||
printf("Error: %d\n", errno); |
|||
perror("write"); |
|||
} else { |
|||
printf("write() wrote %d bytes\n", res); |
|||
} |
|||
|
|||
/* Get a report from the device */ |
|||
res = read(fd, buf, 16); |
|||
if (res < 0) { |
|||
perror("read"); |
|||
} else { |
|||
printf("read() read %d bytes:\n\t", res); |
|||
for (i = 0; i < res; i++) |
|||
printf("%hhx ", buf[i]); |
|||
puts("\n"); |
|||
} |
|||
close(fd); |
|||
return 0; |
|||
} |
|||
|
|||
const char * |
|||
bus_str(int bus) |
|||
{ |
|||
switch (bus) { |
|||
case BUS_USB: |
|||
return "USB"; |
|||
break; |
|||
case BUS_HIL: |
|||
return "HIL"; |
|||
break; |
|||
case BUS_BLUETOOTH: |
|||
return "Bluetooth"; |
|||
break; |
|||
case BUS_VIRTUAL: |
|||
return "Virtual"; |
|||
break; |
|||
default: |
|||
return "Other"; |
|||
break; |
|||
} |
|||
} |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,67 @@ |
|||
#include <linux/types.h> |
|||
#include <linux/input.h> |
|||
#include <linux/hidraw.h> |
|||
#include <sys/ioctl.h> |
|||
#include <sys/types.h> |
|||
#include <sys/stat.h> |
|||
#include <fcntl.h> |
|||
#include <unistd.h> |
|||
#include <stdio.h> |
|||
#include <string.h> |
|||
#include <stdlib.h> |
|||
#include <errno.h> |
|||
|
|||
int main(int argc, char **argv) |
|||
{ |
|||
int fd; |
|||
int res = 0; |
|||
char buf[256]; |
|||
|
|||
/* Open the Device with non-blocking reads. In real life,
|
|||
don't use a hard coded path; use libudev instead. */ |
|||
fd = open("/dev/hidraw0", O_RDWR|O_NONBLOCK); |
|||
|
|||
if (fd < 0) { |
|||
perror("Unable to open device"); |
|||
return 1; |
|||
} |
|||
|
|||
memset(buf, 0x0, sizeof(buf)); |
|||
|
|||
switch (argv[1][0]) { |
|||
case '0': |
|||
break; |
|||
case '1': |
|||
buf[2] = 0xff; |
|||
break; |
|||
case '2': |
|||
buf[3] = 0xff; |
|||
break; |
|||
case '3': |
|||
buf[4] = 0xff; |
|||
break; |
|||
case '4': |
|||
buf[5] = 0xff; |
|||
break; |
|||
default: |
|||
printf("Please specify 0 ... 4 as single argument.\n"); |
|||
} |
|||
|
|||
/* Send a Report to the Device */ |
|||
buf[0] = 0x00; /* Report Number */ |
|||
buf[1] = 0x00; /* Report ID */ |
|||
//buf[2] = 0x01; /* Buzzer 1 */
|
|||
//buf[3] = 0x00; /* Buzzer 2 */
|
|||
//buf[4] = 0x00; /* Buzzer 3 */
|
|||
//buf[5] = 0x01; /* Buzzer 4 */
|
|||
res = write(fd, buf, 6); |
|||
if (res < 0) { |
|||
printf("Error: %d\n", errno); |
|||
perror("write"); |
|||
} else { |
|||
//printf("write() wrote %d bytes\n", res);
|
|||
} |
|||
|
|||
close(fd); |
|||
return 0; |
|||
} |
@ -0,0 +1,67 @@ |
|||
#include <linux/types.h> |
|||
#include <linux/input.h> |
|||
#include <linux/hidraw.h> |
|||
#include <sys/ioctl.h> |
|||
#include <sys/types.h> |
|||
#include <sys/stat.h> |
|||
#include <fcntl.h> |
|||
#include <unistd.h> |
|||
#include <stdio.h> |
|||
#include <string.h> |
|||
#include <stdlib.h> |
|||
#include <errno.h> |
|||
|
|||
int main(int argc, char **argv) |
|||
{ |
|||
int fd; |
|||
int i, res = 0; |
|||
char buf[256]; |
|||
|
|||
/* Open the Device with non-blocking reads. In real life,
|
|||
don't use a hard coded path; use libudev instead. */ |
|||
fd = open("/dev/hidraw0", O_RDWR|O_NONBLOCK); |
|||
|
|||
if (fd < 0) { |
|||
perror("Unable to open device"); |
|||
return 1; |
|||
} |
|||
|
|||
memset(buf, 0x0, sizeof(buf)); |
|||
|
|||
switch (argv[1][0]) { |
|||
case '0': |
|||
break; |
|||
case '1': |
|||
buf[2] = 0xff; |
|||
break; |
|||
case '2': |
|||
buf[3] = 0xff; |
|||
break; |
|||
case '3': |
|||
buf[4] = 0xff; |
|||
break; |
|||
case '4': |
|||
buf[5] = 0xff; |
|||
break; |
|||
default: |
|||
printf("Please specify 0 ... 4 as single argument.\n"); |
|||
} |
|||
|
|||
/* Send a Report to the Device */ |
|||
buf[0] = 0x00; /* Report Number */ |
|||
buf[1] = 0x00; /* Report ID */ |
|||
//buf[2] = 0x01; /* Buzzer 1 */
|
|||
//buf[3] = 0x00; /* Buzzer 2 */
|
|||
//buf[4] = 0x00; /* Buzzer 3 */
|
|||
//buf[5] = 0x01; /* Buzzer 4 */
|
|||
res = write(fd, buf, 6); |
|||
if (res < 0) { |
|||
printf("Error: %d\n", errno); |
|||
perror("write"); |
|||
} else { |
|||
//printf("write() wrote %d bytes\n", res);
|
|||
} |
|||
|
|||
close(fd); |
|||
return 0; |
|||
} |
Loading…
Reference in new issue