Changes in uspace/drv/usbhid/generic/hiddev.c [3facf63a:60c0573] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhid/generic/hiddev.c
r3facf63a r60c0573 37 37 #include <usb/debug.h> 38 38 #include <usb/classes/classes.h> 39 #include <errno.h>40 #include <str_error.h>41 42 #include <usbhid_iface.h>43 39 44 40 #include "hiddev.h" … … 59 55 /*----------------------------------------------------------------------------*/ 60 56 61 static size_t usb_generic_hid_get_event_length(ddf_fun_t *fun);62 63 static int usb_generic_hid_get_event(ddf_fun_t *fun, int32_t *buffer,64 size_t size, size_t *act_size, unsigned int flags);65 66 /*----------------------------------------------------------------------------*/67 68 static usbhid_iface_t usb_generic_iface = {69 .get_event = usb_generic_hid_get_event,70 .get_event_length = usb_generic_hid_get_event_length71 };72 73 static ddf_dev_ops_t usb_generic_hid_ops = {74 .interfaces[USBHID_DEV_IFACE] = &usb_generic_iface75 };76 77 /*----------------------------------------------------------------------------*/78 79 static size_t usb_generic_hid_get_event_length(ddf_fun_t *fun)80 {81 if (fun == NULL || fun->driver_data) {82 return 0;83 }84 85 usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data;86 87 return hid_dev->input_report_size;88 }89 90 /*----------------------------------------------------------------------------*/91 92 static int usb_generic_hid_get_event(ddf_fun_t *fun, int32_t *buffer,93 size_t size, size_t *act_size, unsigned int flags)94 {95 if (fun == NULL || fun->driver_data) {96 return EINVAL;97 }98 99 usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data;100 101 if (hid_dev->input_report_size > size) {102 return EINVAL; // TODO: other error code103 }104 105 /*! @todo This should probably be atomic. */106 memcpy(buffer, hid_dev->input_report, hid_dev->input_report_size);107 *act_size = hid_dev->input_report_size;108 109 // clear the buffer so that it will not be received twice110 memset(hid_dev->input_report, 0, hid_dev->input_report_size);111 112 return EOK;113 }114 115 /*----------------------------------------------------------------------------*/116 117 static int usb_generic_hid_create_function(usb_hid_dev_t *hid_dev)118 {119 /* Create the function exposed under /dev/devices. */120 /** @todo Generate numbers for the devices? */121 usb_log_debug("Creating DDF function %s...\n", HID_GENERIC_FUN_NAME);122 ddf_fun_t *fun = ddf_fun_create(hid_dev->usb_dev->ddf_dev, fun_exposed,123 HID_GENERIC_FUN_NAME);124 if (fun == NULL) {125 usb_log_error("Could not create DDF function node.\n");126 return ENOMEM;127 }128 129 int rc = ddf_fun_bind(fun);130 if (rc != EOK) {131 usb_log_error("Could not bind DDF function: %s.\n",132 str_error(rc));133 ddf_fun_destroy(fun);134 return rc;135 }136 137 fun->ops = &usb_generic_hid_ops;138 fun->driver_data = hid_dev;139 140 return EOK;141 }142 143 /*----------------------------------------------------------------------------*/144 145 int usb_generic_hid_init(usb_hid_dev_t *hid_dev)146 {147 if (hid_dev == NULL) {148 return EINVAL;149 }150 151 return usb_generic_hid_create_function(hid_dev);152 }153 154 /*----------------------------------------------------------------------------*/155 156 57 bool usb_generic_hid_polling_callback(usb_hid_dev_t *hid_dev, 157 58 uint8_t *buffer, size_t buffer_size)
Note:
See TracChangeset
for help on using the changeset viewer.