Changes in uspace/drv/usbhid/generic/hiddev.c [60c0573:dd3eda2] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhid/generic/hiddev.c
r60c0573 rdd3eda2 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> 39 44 40 45 #include "hiddev.h" … … 55 60 /*----------------------------------------------------------------------------*/ 56 61 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_length 74 }; 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_connected 79 }; 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 code 107 } 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 twice 118 //memset(hid_dev->input_report, 0, hid_dev->input_report_size); 119 120 // note that we already received this report 121 // 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 57 175 bool usb_generic_hid_polling_callback(usb_hid_dev_t *hid_dev, 58 176 uint8_t *buffer, size_t buffer_size)
Note:
See TracChangeset
for help on using the changeset viewer.