Changeset 266d0871 in mainline
- Timestamp:
- 2010-12-15T13:25:20Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1840e0d
- Parents:
- d5e7668
- Location:
- uspace
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/vhc/hubops.c
rd5e7668 r266d0871 59 59 static int on_get_descriptor(struct usbvirt_device *dev, 60 60 usb_device_request_setup_packet_t *request, uint8_t *data); 61 static int on_set_configuration(struct usbvirt_device *dev,62 usb_device_request_setup_packet_t *request, uint8_t *data);63 61 static int on_data_request(struct usbvirt_device *dev, 64 62 usb_endpoint_t endpoint, … … 83 81 } 84 82 85 /** Callback for SET_CONFIGURATION request. */ 86 int on_set_configuration(struct usbvirt_device *dev, 87 usb_device_request_setup_packet_t *request, uint8_t *data) 88 { 89 /* We must suspend power source to all ports. */ 83 static void change_all_ports_state(hub_device_t *hub, hub_port_state_t state) 84 { 90 85 size_t i; 91 86 for (i = 0; i < HUB_PORT_COUNT; i++) { 92 hub_port_t *port = &hub_dev.ports[i]; 93 94 set_port_state(port, HUB_PORT_STATE_POWERED_OFF); 95 } 96 97 /* Let the framework handle the rest of the job. */ 98 return EFORWARD; 87 hub_port_t *port = &hub->ports[i]; 88 set_port_state(port, state); 89 } 90 } 91 92 /** Callback when device changes states. */ 93 static void on_state_change(struct usbvirt_device *dev, 94 usbvirt_device_state_t old_state, usbvirt_device_state_t new_state) 95 { 96 switch (new_state) { 97 case USBVIRT_STATE_CONFIGURED: 98 change_all_ports_state(&hub_dev, 99 HUB_PORT_STATE_POWERED_OFF); 100 break; 101 case USBVIRT_STATE_ADDRESS: 102 change_all_ports_state(&hub_dev, 103 HUB_PORT_STATE_NOT_CONFIGURED); 104 break; 105 default: 106 break; 107 } 99 108 } 100 109 … … 518 527 static usbvirt_control_transfer_handler_t endpoint_zero_handlers[] = { 519 528 { 520 STD_REQ(DIR_OUT, REC_DEVICE, USB_DEVREQ_SET_CONFIGURATION),521 .name = "SetConfiguration",522 .callback = on_set_configuration523 },524 {525 529 STD_REQ(DIR_IN, REC_DEVICE, USB_DEVREQ_GET_DESCRIPTOR), 526 530 .name = "GetDescriptor", … … 585 589 .control_transfer_handlers = endpoint_zero_handlers, 586 590 .on_data = NULL, 587 .on_data_request = on_data_request 591 .on_data_request = on_data_request, 592 .on_state_change = on_state_change, 588 593 }; 589 594 -
uspace/lib/usbvirt/include/usbvirt/device.h
rd5e7668 r266d0871 52 52 } usbvirt_request_recipient_t; 53 53 54 /** Possible states of virtual USB device. 55 * Notice that these are not 1:1 mappings to those in USB specification. 56 */ 57 typedef enum { 58 USBVIRT_STATE_DEFAULT, 59 USBVIRT_STATE_ADDRESS, 60 USBVIRT_STATE_CONFIGURED 61 } usbvirt_device_state_t; 62 54 63 typedef struct usbvirt_device usbvirt_device_t; 55 64 struct usbvirt_control_transfer; … … 96 105 usb_direction_t (*decide_control_transfer_direction)( 97 106 usb_endpoint_t endpoint, void *buffer, size_t size); 107 108 /** Callback when device changes its state. 109 * 110 * It is correct that this function is called when both states 111 * are equal (e.g. this function is called during SET_CONFIGURATION 112 * request done on already configured device). 113 * 114 * @warning The value of <code>dev->state</code> before calling 115 * this function is not specified (i.e. can be @p old_state or 116 * @p new_state). 117 */ 118 void (*on_state_change)(usbvirt_device_t *dev, 119 usbvirt_device_state_t old_state, usbvirt_device_state_t new_state); 98 120 } usbvirt_device_ops_t; 99 121 … … 130 152 uint8_t current_configuration; 131 153 } usbvirt_descriptors_t; 132 133 /** Possible states of virtual USB device.134 * Notice that these are not 1:1 mappings to those in USB specification.135 */136 typedef enum {137 USBVIRT_STATE_DEFAULT,138 USBVIRT_STATE_ADDRESS,139 USBVIRT_STATE_CONFIGURED140 } usbvirt_device_state_t;141 154 142 155 /** Information about on-going control transfer. -
uspace/lib/usbvirt/src/ctrlpipe.c
rd5e7668 r266d0871 154 154 * setting address when in configured state). 155 155 */ 156 usbvirt_device_state_t new_state; 156 157 if (device->new_address == 0) { 157 device->state = USBVIRT_STATE_DEFAULT;158 new_state = USBVIRT_STATE_DEFAULT; 158 159 } else { 159 device->state = USBVIRT_STATE_ADDRESS;160 new_state = USBVIRT_STATE_ADDRESS; 160 161 } 161 162 device->address = device->new_address; … … 163 164 device->new_address = -1; 164 165 166 if (DEVICE_HAS_OP(device, on_state_change)) { 167 device->ops->on_state_change(device, device->state, 168 new_state); 169 } 170 device->state = new_state; 171 165 172 device->lib_debug(device, 2, USBVIRT_DEBUGTAG_CONTROL_PIPE_ZERO, 166 173 "device address changed to %d (state %s)", -
uspace/lib/usbvirt/src/stdreq.c
rd5e7668 r266d0871 157 157 158 158 if (configuration_value == 0) { 159 if (DEVICE_HAS_OP(device, on_state_change)) { 160 device->ops->on_state_change(device, device->state, 161 USBVIRT_STATE_ADDRESS); 162 } 159 163 device->state = USBVIRT_STATE_ADDRESS; 160 164 } else { … … 163 167 * user selected existing configuration. 164 168 */ 169 if (DEVICE_HAS_OP(device, on_state_change)) { 170 device->ops->on_state_change(device, device->state, 171 USBVIRT_STATE_CONFIGURED); 172 } 165 173 device->state = USBVIRT_STATE_CONFIGURED; 166 174 if (device->descriptors) {
Note:
See TracChangeset
for help on using the changeset viewer.