Changeset 4971812 in mainline for uspace/lib/usbvirt/ctrlpipe.c
- Timestamp:
- 2010-10-10T21:20:02Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0e41957
- Parents:
- 6c1315b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbvirt/ctrlpipe.c
r6c1315b r4971812 37 37 #include "private.h" 38 38 39 #define REQUEST_TYPE_STANDARD 0 40 #define REQUEST_TYPE_CLASS 1 41 42 #define GET_MIDBITS_MASK(size, shift) \ 43 (((1 << size) - 1) << shift) 44 #define GET_MIDBITS(value, size, shift) \ 45 ((value & GET_MIDBITS_MASK(size, shift)) >> shift) 46 47 static usb_direction_t request_get_direction(uint8_t request_type) 48 { 49 int bit7 = GET_MIDBITS(request_type, 1, 7); 50 return bit7 ? USB_DIRECTION_IN : USB_DIRECTION_OUT; 51 } 52 53 static int request_get_type(uint8_t request_type) 54 { 55 return GET_MIDBITS(request_type, 2, 5); 56 } 57 58 static int request_get_recipient(uint8_t request_type) 59 { 60 return GET_MIDBITS(request_type, 5, 0); 61 } 62 63 64 typedef struct { 65 uint8_t request_type; 66 uint8_t request; 67 uint16_t value; 68 uint16_t index; 69 uint16_t length; 70 } __attribute__ ((packed)) devreq_setup_packet_t; 71 39 72 int control_pipe(void *buffer, size_t size) 40 73 { 41 // TODO 74 if (size < sizeof(devreq_setup_packet_t)) { 75 return ENOMEM; 76 } 77 78 devreq_setup_packet_t *request = (devreq_setup_packet_t *) buffer; 79 uint8_t *remaining_data = ((uint8_t *) request) + sizeof(devreq_setup_packet_t); 80 81 usb_direction_t direction = request_get_direction(request->request_type); 82 int type = request_get_type(request->request_type); 83 int recipient = request_get_recipient(request->request_type); 84 85 86 switch (type) { 87 case REQUEST_TYPE_STANDARD: 88 return handle_std_request(direction, recipient, 89 request->request, request->value, 90 request->index, request->length, 91 remaining_data); 92 break; 93 case REQUEST_TYPE_CLASS: 94 if (DEVICE_HAS_OP(device, on_devreq_class)) { 95 return device->ops->on_devreq_class(device, 96 direction, recipient, 97 request->request, request->value, 98 request->index, request->length, 99 remaining_data); 100 } 101 break; 102 default: 103 break; 104 } 105 42 106 return EOK; 43 107 }
Note:
See TracChangeset
for help on using the changeset viewer.