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