Changes in uspace/drv/usbhid/generic/hiddev.c [60c0573:3facf63a] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhid/generic/hiddev.c
r60c0573 r3facf63a 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> 39 43 40 44 #include "hiddev.h" … … 55 59 /*----------------------------------------------------------------------------*/ 56 60 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_length 71 }; 72 73 static ddf_dev_ops_t usb_generic_hid_ops = { 74 .interfaces[USBHID_DEV_IFACE] = &usb_generic_iface 75 }; 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 code 103 } 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 twice 110 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 57 156 bool usb_generic_hid_polling_callback(usb_hid_dev_t *hid_dev, 58 157 uint8_t *buffer, size_t buffer_size)
Note:
See TracChangeset
for help on using the changeset viewer.