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