Changes in uspace/drv/bus/usb/usbhid/generic/hiddev.c [9d58539:56fd7cf] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbhid/generic/hiddev.c
r9d58539 r56fd7cf 35 35 */ 36 36 37 /* XXX Fix this */ 38 #define _DDF_DATA_IMPLANT 39 37 40 #include <usb/debug.h> 38 41 #include <usb/classes/classes.h> … … 46 49 #include "usbhid.h" 47 50 48 /*----------------------------------------------------------------------------*/ 51 49 52 50 53 const usb_endpoint_description_t usb_hid_generic_poll_endpoint_description = { … … 60 63 const char *HID_GENERIC_CLASS_NAME = "hid"; 61 64 62 /*----------------------------------------------------------------------------*/ 65 63 66 static size_t usb_generic_hid_get_event_length(ddf_fun_t *fun); 64 67 static int usb_generic_hid_get_event(ddf_fun_t *fun, uint8_t *buffer, … … 68 71 static int usb_generic_get_report_descriptor(ddf_fun_t *fun, uint8_t *desc, 69 72 size_t size, size_t *actual_size); 70 /*----------------------------------------------------------------------------*/ 73 71 74 static usbhid_iface_t usb_generic_iface = { 72 75 .get_event = usb_generic_hid_get_event, … … 75 78 .get_report_descriptor = usb_generic_get_report_descriptor 76 79 }; 77 /*----------------------------------------------------------------------------*/ 80 78 81 static ddf_dev_ops_t usb_generic_hid_ops = { 79 82 .interfaces[USBHID_DEV_IFACE] = &usb_generic_iface, 80 83 .open = usb_generic_hid_client_connected 81 84 }; 82 /*----------------------------------------------------------------------------*/ 85 86 /** Return hid_dev_t * for generic HID function node. 87 * 88 * For the generic HID subdriver the 'hid' function has usb_hid_gen_fun_t 89 * as soft state. Through that we can get to the usb_hid_dev_t. 90 */ 91 static usb_hid_dev_t *fun_hid_dev(ddf_fun_t *fun) 92 { 93 return ((usb_hid_gen_fun_t *)ddf_fun_data_get(fun))->hid_dev; 94 } 95 83 96 static size_t usb_generic_hid_get_event_length(ddf_fun_t *fun) 84 97 { 85 98 usb_log_debug2("Generic HID: Get event length (fun: %p, " 86 "fun->driver_data: %p.\n", fun, fun->driver_data); 87 88 if (fun == NULL || fun->driver_data == NULL) { 89 return 0; 90 } 91 92 const usb_hid_dev_t *hid_dev = fun->driver_data; 99 "fun->driver_data: %p.\n", fun, ddf_fun_data_get(fun)); 100 101 const usb_hid_dev_t *hid_dev = fun_hid_dev(fun); 93 102 94 103 usb_log_debug2("hid_dev: %p, Max input report size (%zu).\n", … … 97 106 return hid_dev->max_input_report_size; 98 107 } 99 /*----------------------------------------------------------------------------*/ 108 100 109 static int usb_generic_hid_get_event(ddf_fun_t *fun, uint8_t *buffer, 101 110 size_t size, size_t *act_size, int *event_nr, unsigned int flags) … … 103 112 usb_log_debug2("Generic HID: Get event.\n"); 104 113 105 if (fun == NULL || fun->driver_data == NULL || buffer == NULL 106 || act_size == NULL || event_nr == NULL) { 114 if (buffer == NULL || act_size == NULL || event_nr == NULL) { 107 115 usb_log_debug("No function"); 108 116 return EINVAL; 109 117 } 110 118 111 const usb_hid_dev_t *hid_dev = (usb_hid_dev_t *)fun->driver_data;119 const usb_hid_dev_t *hid_dev = fun_hid_dev(fun); 112 120 113 121 if (hid_dev->input_report_size > size) { … … 127 135 return EOK; 128 136 } 129 /*----------------------------------------------------------------------------*/ 137 130 138 static size_t usb_generic_get_report_descriptor_length(ddf_fun_t *fun) 131 139 { 132 140 usb_log_debug("Generic HID: Get report descriptor length.\n"); 133 141 134 if (fun == NULL || fun->driver_data == NULL) { 135 usb_log_debug("No function"); 136 return EINVAL; 137 } 138 139 const usb_hid_dev_t *hid_dev = fun->driver_data; 142 const usb_hid_dev_t *hid_dev = fun_hid_dev(fun); 140 143 141 144 usb_log_debug2("hid_dev->report_desc_size = %zu\n", … … 144 147 return hid_dev->report_desc_size; 145 148 } 146 /*----------------------------------------------------------------------------*/ 149 147 150 static int usb_generic_get_report_descriptor(ddf_fun_t *fun, uint8_t *desc, 148 151 size_t size, size_t *actual_size) … … 150 153 usb_log_debug2("Generic HID: Get report descriptor.\n"); 151 154 152 if (fun == NULL || fun->driver_data == NULL) { 153 usb_log_debug("No function"); 154 return EINVAL; 155 } 156 157 const usb_hid_dev_t *hid_dev = fun->driver_data; 155 const usb_hid_dev_t *hid_dev = fun_hid_dev(fun); 158 156 159 157 if (hid_dev->report_desc_size > size) { … … 166 164 return EOK; 167 165 } 168 /*----------------------------------------------------------------------------*/ 166 169 167 static int usb_generic_hid_client_connected(ddf_fun_t *fun) 170 168 { … … 172 170 return EOK; 173 171 } 174 /*----------------------------------------------------------------------------*/ 172 175 173 void usb_generic_hid_deinit(usb_hid_dev_t *hid_dev, void *data) 176 174 { … … 183 181 return; 184 182 } 185 usb_log_debug2("%s unbound.\n", fun->name); 186 /* We did not allocate this, so leave this alone 187 * the device would take care of it */ 188 fun->driver_data = NULL; 183 usb_log_debug2("%s unbound.\n", ddf_fun_get_name(fun)); 189 184 ddf_fun_destroy(fun); 190 185 } 191 /*----------------------------------------------------------------------------*/ 186 192 187 int usb_generic_hid_init(usb_hid_dev_t *hid_dev, void **data) 193 188 { 189 usb_hid_gen_fun_t *hid_fun; 190 194 191 if (hid_dev == NULL) { 195 192 return EINVAL; … … 205 202 } 206 203 207 /* This is nasty, both device and this function have the same208 * driver data, thus destruction causes to double free */209 fun->driver_data= hid_dev;210 fun->ops = &usb_generic_hid_ops;204 /* Create softstate */ 205 hid_fun = ddf_fun_data_alloc(fun, sizeof(usb_hid_gen_fun_t)); 206 hid_fun->hid_dev = hid_dev; 207 ddf_fun_set_ops(fun, &usb_generic_hid_ops); 211 208 212 209 int rc = ddf_fun_bind(fun); … … 214 211 usb_log_error("Could not bind DDF function: %s.\n", 215 212 str_error(rc)); 216 fun->driver_data = NULL;217 213 ddf_fun_destroy(fun); 218 214 return rc; 219 215 } 220 216 221 usb_log_debug("HID function created. Handle: %" PRIun "\n", fun->handle); 217 usb_log_debug("HID function created. Handle: %" PRIun "\n", 218 ddf_fun_get_handle(fun)); 222 219 *data = fun; 223 220 224 221 return EOK; 225 222 } 226 /*----------------------------------------------------------------------------*/ 223 227 224 bool usb_generic_hid_polling_callback(usb_hid_dev_t *hid_dev, void *data) 228 225 {
Note:
See TracChangeset
for help on using the changeset viewer.