From 1ca47870476f9c3bcc73a43f878c86fc35b51246 Mon Sep 17 00:00:00 2001 From: Timo Kokkonen Date: Wed, 27 Apr 2011 21:09:18 +0300 Subject: [PATCH] Refactor hiddev functions out from main.c Signed-off-by: Timo Kokkonen --- Makefile | 2 +- hiddev.c | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ hiddev.h | 10 ++++ main.c | 135 ++---------------------------------------------------- 4 files changed, 151 insertions(+), 133 deletions(-) create mode 100644 hiddev.c create mode 100644 hiddev.h diff --git a/Makefile b/Makefile index c5f7cb7..2846968 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ CC = gcc LD = ld CFLAGS = -Wall -O2 -g -GLUCOSE_OBJS = main.o +GLUCOSE_OBJS = main.o hiddev.o ALL_OBJS = $(GLUCOSE_OBJS) ALL_DEBS = $(shell echo " "$(ALL_OBJS) | sed -e "s,[^ ]*\.a,,g" -e \ diff --git a/hiddev.c b/hiddev.c new file mode 100644 index 0000000..237b2ba --- /dev/null +++ b/hiddev.c @@ -0,0 +1,137 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hiddev.h" + +#define PRINT_FIELD(field) printf(#field ": %04x\n", field) + +int hiddev_read(unsigned char *data, int bufsize, int fd) +{ + struct hiddev_event readBuffer[READ_BUFFER_LENGTH]; + int ret, n, i; + + ret = read(fd, readBuffer, sizeof(readBuffer)); + if (ret < 0) + return ret; + + n = ret / sizeof(readBuffer[0]); + for (i = 0; i < n && i < bufsize; i++) + data[i] = readBuffer[i].value; + return n; +} + +int hiddev_write(const unsigned char data[64], int fd , int usage_code) +{ + int rc = 0, uindex, error; + + struct hiddev_usage_ref uref; + struct hiddev_report_info rinfo; + + uref.report_id = *data++; + uref.report_type = HID_REPORT_TYPE_OUTPUT; + uref.field_index = 0; + + uref.usage_code = usage_code; + + for (uindex = 0; uindex < 63; uindex++) { + uref.usage_index = uindex; + uref.value = *data++; + + rc = ioctl(fd, HIDIOCSUSAGE, &uref); + if (rc != 0) + goto err; + } + + rinfo.report_type = HID_REPORT_TYPE_OUTPUT; + rinfo.report_id = 0x0; + rinfo.num_fields = 1; + + rc = ioctl(fd, HIDIOCSREPORT, &rinfo); + if (rc != 0) + goto err2; + + return 0; +err2: + printf("HIDIOCSREPORT\n"); +err: + error = errno; + printf("Error in IOCTL: %s\n", strerror(error)); + + return rc; +} + +static int get_usagecode(int fd) +{ + struct hiddev_usage_ref uref; + int rc, error; + + uref.report_type = HID_REPORT_TYPE_OUTPUT; + uref.report_id = 0x0; + uref.field_index = 0; + uref.usage_index = 0; + + rc = ioctl(fd, HIDIOCGUCODE, &uref); + if (rc < 0) { + error = errno; + printf("Error gettin usage code: %s\n", strerror(error)); + return rc; + } + + return uref.usage_code; +} + +int hiddev_open(const char *device_path, int *usage_code) +{ + struct hiddev_devinfo device_info; + struct hiddev_report_info rinfo; + int ret, error; + int fd; + fd = ret = open(device_path, O_RDWR); + + if (fd < 0) + goto err; + + + rinfo.report_type = HID_REPORT_TYPE_OUTPUT; + rinfo.report_id = HID_REPORT_ID_FIRST; + ret = ioctl(fd, HIDIOCGREPORTINFO, &rinfo); + if (ret < 0) + goto err; + + PRINT_FIELD(rinfo.report_type); + PRINT_FIELD(rinfo.report_id); + PRINT_FIELD(rinfo.num_fields); + + *usage_code = get_usagecode(fd); + + if (*usage_code < 0) + return -8; + + ret = ioctl(fd, HIDIOCGDEVINFO, &device_info); + + if (ret < 0) + goto err; + + PRINT_FIELD(device_info.bustype); + PRINT_FIELD(device_info.busnum); + PRINT_FIELD(device_info.devnum); + PRINT_FIELD(device_info.ifnum); + PRINT_FIELD(device_info.vendor); + PRINT_FIELD(device_info.product); + PRINT_FIELD(device_info.version); + PRINT_FIELD(device_info.num_applications); + + return fd; + +err: + error = errno; + printf("Error opening device %s: %s\n", device_path, strerror(error)); + return ret; +} + diff --git a/hiddev.h b/hiddev.h new file mode 100644 index 0000000..a37c60f --- /dev/null +++ b/hiddev.h @@ -0,0 +1,10 @@ +#ifndef __HIDDEV_H_ +#define __HIDDEV_H_ + +#define READ_BUFFER_LENGTH 64 + +int hiddev_read(unsigned char *data, int bufsize, int fd); +int hiddev_write(const unsigned char data[64], int fd , int usage_code); +int hiddev_open(const char *device_path, int *usage_code); + +#endif diff --git a/main.c b/main.c index e912fe4..a453980 100644 --- a/main.c +++ b/main.c @@ -1,20 +1,16 @@ #include #include -#include #include -#include #include #include #include #include #include -#define PRINT_FIELD(field) printf(#field ": %04x\n", field) +#include "hiddev.h" #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) -#define READ_BUFFER_LENGTH 64 - struct msg { int direction; unsigned char data[64]; @@ -61,131 +57,6 @@ static void print_ascii(const unsigned char *data, int len) printf("\n"); } -int hid_read(unsigned char *data, int bufsize, int fd) -{ - struct hiddev_event readBuffer[READ_BUFFER_LENGTH]; - int ret, n, i; - - ret = read(fd, readBuffer, sizeof(readBuffer)); - if (ret < 0) - return ret; - - n = ret / sizeof(readBuffer[0]); - for (i = 0; i < n && i < bufsize; i++) - data[i] = readBuffer[i].value; - return n; -} - - -int hid_write(const unsigned char data[64], int fd , int usage_code) -{ - int rc = 0, uindex, error; - - struct hiddev_usage_ref uref; - struct hiddev_report_info rinfo; - - uref.report_id = *data++; - uref.report_type = HID_REPORT_TYPE_OUTPUT; - uref.field_index = 0; - - uref.usage_code = usage_code; - - for (uindex = 0; uindex < 63; uindex++) { - uref.usage_index = uindex; - uref.value = *data++; - - rc = ioctl(fd, HIDIOCSUSAGE, &uref); - if (rc != 0) - goto err; - } - - rinfo.report_type = HID_REPORT_TYPE_OUTPUT; - rinfo.report_id = 0x0; - rinfo.num_fields = 1; - - rc = ioctl(fd, HIDIOCSREPORT, &rinfo); - if (rc != 0) - goto err2; - - return 0; -err2: - printf("HIDIOCSREPORT\n"); -err: - error = errno; - printf("Error in IOCTL: %s\n", strerror(error)); - - return rc; -} - -int get_usagecode(int fd) -{ - struct hiddev_usage_ref uref; - int rc, error; - - uref.report_type = HID_REPORT_TYPE_OUTPUT; - uref.report_id = 0x0; - uref.field_index = 0; - uref.usage_index = 0; - - rc = ioctl(fd, HIDIOCGUCODE, &uref); - if (rc < 0) { - error = errno; - printf("Error gettin usage code: %s\n", strerror(error)); - return rc; - } - - return uref.usage_code; -} - -int hiddev_open(const char *device_path, int *usage_code) -{ - struct hiddev_devinfo device_info; - struct hiddev_report_info rinfo; - int ret, error; - int fd; - fd = ret = open(device_path, O_RDWR); - - if (fd < 0) - goto err; - - - rinfo.report_type = HID_REPORT_TYPE_OUTPUT; - rinfo.report_id = HID_REPORT_ID_FIRST; - ret = ioctl(fd, HIDIOCGREPORTINFO, &rinfo); - if (ret < 0) - goto err; - - PRINT_FIELD(rinfo.report_type); - PRINT_FIELD(rinfo.report_id); - PRINT_FIELD(rinfo.num_fields); - - *usage_code = get_usagecode(fd); - - if (*usage_code < 0) - return -8; - - ret = ioctl(fd, HIDIOCGDEVINFO, &device_info); - - if (ret < 0) - goto err; - - PRINT_FIELD(device_info.bustype); - PRINT_FIELD(device_info.busnum); - PRINT_FIELD(device_info.devnum); - PRINT_FIELD(device_info.ifnum); - PRINT_FIELD(device_info.vendor); - PRINT_FIELD(device_info.product); - PRINT_FIELD(device_info.version); - PRINT_FIELD(device_info.num_applications); - - return fd; - -err: - error = errno; - printf("Error opening device %s: %s\n", device_path, strerror(error)); - return ret; -} - int send_msg(const struct msg *msg, int fd, int usage_code) { int ret; @@ -200,7 +71,7 @@ int send_msg(const struct msg *msg, int fd, int usage_code) print_hex(msg->data + 1, datalen(msg->data) - 1); print_ascii(msg->data + 1, datalen(msg->data) - 1); - ret = hid_write(msg->data, fd, usage_code); + ret = hiddev_write(msg->data, fd, usage_code); if (ret) exit(1); @@ -213,7 +84,7 @@ int read_and_verify(struct msg *msg, int fd) int ret, offset = 0; while (offset < 64) { - ret = hid_read(buf + offset, sizeof(buf) - offset, fd); + ret = hiddev_read(buf + offset, sizeof(buf) - offset, fd); if (ret < 0) goto err; -- 2.44.0