1 /* 2 * Implementation of DDEkit related calls/data 3 */ 4 5 #include <string.h> /* memset */ 6 7 #include <ddekit/usb.h> 8 9 #include <usb/hcd_ddekit.h> 10 #include <usb/hcd_interface.h> 11 #include <usb/usb_common.h> 12 13 14 /*===========================================================================* 15 * Local declarations * 16 *===========================================================================*/ 17 /* 18 * In this file "struct ddekit_usb_dev" equals "hcd_device_state" 19 * */ 20 struct ddekit_usb_device_id; 21 struct ddekit_usb_urb; 22 struct ddekit_usb_dev; 23 24 /* Translates DDEKit UBR to one used by HCD */ 25 static void hcd_decode_urb(hcd_urb *, struct ddekit_usb_urb *); 26 static void hcd_encode_urb(hcd_urb *, struct ddekit_usb_urb *); 27 28 29 /*===========================================================================* 30 * Global definitions * 31 *===========================================================================*/ 32 ddekit_usb_completion_cb completion_cb = NULL; 33 ddekit_usb_connect_cb connect_cb = NULL; 34 ddekit_usb_disconnect_cb disconnect_cb = NULL; 35 36 37 /*===========================================================================* 38 * Implementation for usb_server.c * 39 *===========================================================================*/ 40 41 /*===========================================================================* 42 * _ddekit_usb_get_manufacturer * 43 *===========================================================================*/ 44 char * 45 _ddekit_usb_get_manufacturer(struct ddekit_usb_dev * ddev) 46 { 47 static const char mfg[] = "UNKNOWN"; 48 DEBUG_DUMP; 49 /* TODO: UNUSED for argument won't work */ 50 ((void)ddev); 51 return (char *)mfg; 52 } 53 54 55 /*===========================================================================* 56 * _ddekit_usb_get_product * 57 *===========================================================================*/ 58 char * 59 _ddekit_usb_get_product(struct ddekit_usb_dev * ddev) 60 { 61 static const char prod[] = "UNKNOWN"; 62 DEBUG_DUMP; 63 /* TODO: UNUSED for argument won't work */ 64 ((void)ddev); 65 return (char *)prod; 66 } 67 68 69 /*===========================================================================* 70 * _ddekit_usb_get_serial * 71 *===========================================================================*/ 72 char * 73 _ddekit_usb_get_serial(struct ddekit_usb_dev * ddev) 74 { 75 static const char serial[] = "UNKNOWN"; 76 DEBUG_DUMP; 77 /* TODO: UNUSED for argument won't work */ 78 ((void)ddev); 79 return (char *)serial; 80 } 81 82 83 /*===========================================================================* 84 * _ddekit_usb_get_device_desc * 85 *===========================================================================*/ 86 struct usb_device_descriptor * 87 _ddekit_usb_get_device_desc(struct ddekit_usb_dev * ddev) 88 { 89 hcd_device_state * dev; 90 91 DEBUG_DUMP; 92 93 dev = (hcd_device_state *)ddev; 94 95 return (struct usb_device_descriptor *) 96 (&(dev->config_tree.descriptor)); 97 } 98 99 100 /*===========================================================================* 101 * _ddekit_usb_get_interface_desc * 102 *===========================================================================*/ 103 struct usb_interface_descriptor * 104 _ddekit_usb_get_interface_desc(struct ddekit_usb_dev * ddev, int inum) 105 { 106 hcd_device_state * dev; 107 108 DEBUG_DUMP; 109 110 dev = (hcd_device_state *)ddev; 111 112 return (struct usb_interface_descriptor *) 113 (&(dev->config_tree.interface[inum].descriptor)); 114 } 115 116 117 /*===========================================================================* 118 * Implementation for <ddekit/usb.h> * 119 *===========================================================================*/ 120 121 /*===========================================================================* 122 * ddekit_usb_dev_set_data * 123 *===========================================================================*/ 124 int 125 ddekit_usb_dev_set_data(struct ddekit_usb_dev * dev, void * data) 126 { 127 hcd_device_state * hcd_dev; 128 129 DEBUG_DUMP; 130 131 hcd_dev = (hcd_device_state *)dev; 132 133 hcd_dev->data = data; 134 135 return EXIT_SUCCESS; 136 } 137 138 139 /*===========================================================================* 140 * ddekit_usb_dev_get_data * 141 *===========================================================================*/ 142 void * 143 ddekit_usb_dev_get_data(struct ddekit_usb_dev * dev) 144 { 145 hcd_device_state * hcd_dev; 146 147 DEBUG_DUMP; 148 149 hcd_dev = (hcd_device_state *)dev; 150 151 return hcd_dev->data; 152 } 153 154 155 /* TODO: This was in 'ddekit/usb.h' header file, but is not used anywhere */ 156 #if 0 157 /*===========================================================================* 158 * ddekit_usb_get_device_id * 159 *===========================================================================*/ 160 void 161 ddekit_usb_get_device_id(struct ddekit_usb_dev * dev, 162 struct ddekit_usb_device_id * id) 163 { 164 DEBUG_DUMP; 165 /* TODO: UNUSED for argument won't work */ 166 ((void)dev); 167 ((void)id); 168 return; 169 } 170 #endif 171 172 173 /*===========================================================================* 174 * ddekit_usb_submit_urb * 175 *===========================================================================*/ 176 int 177 ddekit_usb_submit_urb(struct ddekit_usb_urb * d_urb) 178 { 179 hcd_device_state * dev; 180 hcd_driver_state * drv; 181 182 DEBUG_DUMP; 183 184 /* Retrieve info on device/driver state from DDEKit's USB */ 185 dev = (hcd_device_state *)(d_urb->dev); 186 drv = (hcd_driver_state *)(dev->driver); 187 188 /* Check for latest URB completion */ 189 if (NULL == dev->urb.original_urb) { 190 191 /* Remember original URB */ 192 dev->urb.original_urb = (void *)d_urb; 193 194 /* TODO: If multiple URB's have to be queued, this code 195 * or DDEKit's must be altered accordingly */ 196 /* Turn DDEKit URB format to one that is easier to 197 * handle by HCD, also check if URB is valid */ 198 hcd_decode_urb(&(dev->urb), d_urb); 199 200 /* Start handling URB event */ 201 drv->current_event = HCD_EVENT_URB; 202 hcd_handle_event(drv); 203 204 return EXIT_SUCCESS; 205 } 206 207 /* Last URB must not have been completed */ 208 return EXIT_FAILURE; 209 } 210 211 212 /*===========================================================================* 213 * ddekit_usb_cancle_urb * 214 *===========================================================================*/ 215 int 216 ddekit_usb_cancle_urb(struct ddekit_usb_urb * d_urb) 217 { 218 DEBUG_DUMP; 219 /* TODO: UNUSED for argument won't work */ 220 ((void)d_urb); 221 return EXIT_SUCCESS; 222 } 223 224 225 /*===========================================================================* 226 * ddekit_usb_init * 227 *===========================================================================*/ 228 int 229 ddekit_usb_init(struct ddekit_usb_driver * drv, 230 ddekit_usb_malloc_fn * _m, 231 ddekit_usb_free_fn * _f) 232 { 233 DEBUG_DUMP; 234 235 completion_cb = drv->completion; 236 connect_cb = drv->connect; 237 disconnect_cb = drv->disconnect; 238 239 *_m = malloc; 240 *_f = free; 241 242 return EXIT_SUCCESS; 243 } 244 245 246 /*===========================================================================* 247 * hcd_connect_cb * 248 *===========================================================================*/ 249 void 250 hcd_connect_cb(hcd_device_state * dev) 251 { 252 unsigned int if_bitmask; 253 254 DEBUG_DUMP; 255 256 /* TODO: Magic numbers like in ddekit/devman */ 257 /* Each bit starting from 0, represents valid interface */ 258 if_bitmask = 0xFFFFFFFF >> (32 - dev->config_tree.num_interfaces); 259 260 USB_DBG("Interfaces %d, mask %08X", 261 dev->config_tree.num_interfaces, 262 if_bitmask); 263 264 connect_cb((struct ddekit_usb_dev *)dev, (int)if_bitmask); 265 } 266 267 268 /*===========================================================================* 269 * hcd_disconnect_cb * 270 *===========================================================================*/ 271 void 272 hcd_disconnect_cb(hcd_device_state * dev) 273 { 274 DEBUG_DUMP; 275 276 disconnect_cb((struct ddekit_usb_dev *)dev); 277 } 278 279 280 /*===========================================================================* 281 * hcd_completion_cb * 282 *===========================================================================*/ 283 void 284 hcd_completion_cb(hcd_urb * urb) 285 { 286 struct ddekit_usb_urb * d_urb; 287 288 DEBUG_DUMP; 289 290 /* Recollect original URB */ 291 d_urb = (struct ddekit_usb_urb *)urb->original_urb; 292 293 /* Turn HCD URB format to one handled by DDEKit */ 294 hcd_encode_urb(urb, d_urb); 295 296 completion_cb(d_urb->priv); 297 298 /* URB was handled, forget about it */ 299 urb->original_urb = NULL; 300 } 301 302 303 /*===========================================================================* 304 * hcd_decode_urb * 305 *===========================================================================*/ 306 static void 307 hcd_decode_urb(hcd_urb * urb, struct ddekit_usb_urb * dde_urb) 308 { 309 DEBUG_DUMP; 310 311 /* No UBR error initially */ 312 urb->inout_status = EXIT_SUCCESS; 313 314 /* Check transfer direction */ 315 switch (dde_urb->direction) { 316 case DDEKIT_USB_IN: 317 urb->direction = HCD_DIRECTION_IN; 318 break; 319 case DDEKIT_USB_OUT: 320 urb->direction = HCD_DIRECTION_OUT; 321 break; 322 default: 323 USB_MSG("URB direction error"); 324 goto URB_ERROR; 325 } 326 327 /* Check transfer type */ 328 switch (dde_urb->type) { 329 case DDEKIT_USB_TRANSFER_ISO: 330 urb->type = HCD_TRANSFER_ISOCHRONOUS; 331 break; 332 case DDEKIT_USB_TRANSFER_INT: 333 urb->type = HCD_TRANSFER_INTERRUPT; 334 break; 335 case DDEKIT_USB_TRANSFER_CTL: 336 urb->type = HCD_TRANSFER_CONTROL; 337 break; 338 case DDEKIT_USB_TRANSFER_BLK: 339 urb->type = HCD_TRANSFER_BULK; 340 break; 341 default: 342 USB_MSG("URB type error"); 343 goto URB_ERROR; 344 } 345 346 /* Check transfer endpoint validity */ 347 if ((dde_urb->endpoint <= (int)HCD_LAST_EP) && 348 (dde_urb->endpoint >= (int)HCD_DEFAULT_EP)) 349 urb->endpoint = (hcd_reg1)dde_urb->endpoint; 350 else { 351 USB_MSG("URB endpoint error"); 352 goto URB_ERROR; 353 } 354 355 /* Check transfer interval validity */ 356 if ((dde_urb->interval <= (int)HCD_HIGHEST_INTERVAL) && 357 (dde_urb->interval >= (int)HCD_LOWEST_INTERVAL)) 358 urb->interval = (hcd_reg1)dde_urb->interval; 359 else { 360 USB_MSG("URB interval error"); 361 goto URB_ERROR; 362 } 363 364 /* TODO: Alignment of setup packet. Can DDE client guarantee that? */ 365 /* Transfer data assignment */ 366 urb->inout_data = (hcd_reg1 *)dde_urb->data; 367 urb->in_setup = (hcd_ctrlrequest *)dde_urb->setup_packet; 368 369 /* TODO: Sane size check? */ 370 urb->in_size = (hcd_reg4)dde_urb->size; 371 372 /* Buffer validity check */ 373 if ((NULL == urb->inout_data) && (NULL == urb->in_setup)) { 374 USB_MSG("URB buffer error"); 375 goto URB_ERROR; 376 } 377 378 /* Remember device and check for NULL */ 379 if (NULL == (urb->target_device = (hcd_device_state *)dde_urb->dev)) { 380 USB_MSG("URB device pointer error"); 381 goto URB_ERROR; 382 } 383 384 /* Decoding completed */ 385 return; 386 387 URB_ERROR: 388 urb->inout_status = EXIT_FAILURE; 389 } 390 391 392 /*===========================================================================* 393 * hcd_encode_urb * 394 *===========================================================================*/ 395 static void 396 hcd_encode_urb(hcd_urb * urb, struct ddekit_usb_urb * dde_urb) 397 { 398 DEBUG_DUMP; 399 400 /* Rewrite output for DDEKit part */ 401 dde_urb->actual_length = urb->out_size; 402 dde_urb->status = urb->inout_status; 403 } 404