Changeset 4deca9b in mainline for uspace/drv/ohci
- Timestamp:
- 2011-04-12T11:43:35Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 651b352
- Parents:
- 1324ff3 (diff), 910ca3f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- uspace/drv/ohci
- Files:
-
- 4 edited
-
batch.c (modified) (14 diffs)
-
hc.c (modified) (6 diffs)
-
root_hub.c (modified) (6 diffs)
-
root_hub.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ohci/batch.c
r1324ff3 r4deca9b 73 73 CHECK_NULL_DISPOSE_RETURN(instance, 74 74 "Failed to allocate batch instance.\n"); 75 usb_target_t target = 76 { .address = ep->address, .endpoint = ep->endpoint }; 77 usb_transfer_batch_init(instance, target, ep->transfer_type, ep->speed, 78 ep->max_packet_size, buffer, NULL, buffer_size, NULL, setup_size, 79 func_in, func_out, arg, fun, ep, NULL); 75 usb_transfer_batch_init(instance, ep, buffer, NULL, buffer_size, 76 NULL, setup_size, func_in, func_out, arg, fun, NULL); 80 77 81 78 ohci_batch_t *data = malloc(sizeof(ohci_batch_t)); … … 101 98 102 99 if (buffer_size > 0) { 103 instance-> transport_buffer = malloc32(buffer_size);104 CHECK_NULL_DISPOSE_RETURN(instance-> transport_buffer,100 instance->data_buffer = malloc32(buffer_size); 101 CHECK_NULL_DISPOSE_RETURN(instance->data_buffer, 105 102 "Failed to allocate device accessible buffer.\n"); 106 103 } … … 124 121 free32(data->tds); 125 122 free32(instance->setup_buffer); 126 free32(instance-> transport_buffer);123 free32(instance->data_buffer); 127 124 free(data); 128 125 free(instance); … … 165 162 assert(instance); 166 163 /* We are data out, we are supposed to provide data */ 167 memcpy(instance->transport_buffer, instance->buffer, 168 instance->buffer_size); 164 memcpy(instance->data_buffer, instance->buffer, instance->buffer_size); 169 165 instance->next_step = batch_call_out_and_dispose; 170 166 batch_control(instance, USB_DIRECTION_OUT, USB_DIRECTION_IN); … … 183 179 { 184 180 assert(instance); 185 assert(instance->direction == USB_DIRECTION_IN);186 181 instance->next_step = batch_call_in_and_dispose; 187 182 batch_data(instance); … … 192 187 { 193 188 assert(instance); 194 assert(instance->direction == USB_DIRECTION_OUT);195 189 /* We are data out, we are supposed to provide data */ 196 memcpy(instance->transport_buffer, instance->buffer, 197 instance->buffer_size); 190 memcpy(instance->data_buffer, instance->buffer, instance->buffer_size); 198 191 instance->next_step = batch_call_out_and_dispose; 199 192 batch_data(instance); … … 204 197 { 205 198 assert(instance); 206 instance->direction = USB_DIRECTION_IN;207 199 instance->next_step = batch_call_in_and_dispose; 208 200 batch_data(instance); … … 213 205 { 214 206 assert(instance); 215 instance->direction = USB_DIRECTION_IN;216 207 instance->next_step = batch_call_in_and_dispose; 217 208 batch_data(instance); … … 249 240 size_t td_current = 1; 250 241 size_t remain_size = instance->buffer_size; 251 char * transfer_buffer = instance->transport_buffer;242 char *buffer = instance->data_buffer; 252 243 while (remain_size > 0) { 253 244 size_t transfer_size = remain_size > OHCI_TD_MAX_TRANSFER ? … … 255 246 toggle = 1 - toggle; 256 247 257 td_init(&data->tds[td_current], data_dir, transfer_buffer,248 td_init(&data->tds[td_current], data_dir, buffer, 258 249 transfer_size, toggle); 259 250 td_set_next(&data->tds[td_current], &data->tds[td_current + 1]); … … 262 253 data->tds[td_current].next, data->tds[td_current].be); 263 254 264 transfer_buffer += transfer_size;255 buffer += transfer_size; 265 256 remain_size -= transfer_size; 266 257 assert(td_current < data->td_count - 2); … … 290 281 size_t td_current = 0; 291 282 size_t remain_size = instance->buffer_size; 292 char * transfer_buffer = instance->transport_buffer;283 char *buffer = instance->data_buffer; 293 284 while (remain_size > 0) { 294 285 size_t transfer_size = remain_size > OHCI_TD_MAX_TRANSFER ? … … 296 287 297 288 td_init(&data->tds[td_current], instance->ep->direction, 298 transfer_buffer, transfer_size, -1);289 buffer, transfer_size, -1); 299 290 td_set_next(&data->tds[td_current], &data->tds[td_current + 1]); 300 291 usb_log_debug("Created DATA TD: %x:%x:%x:%x.\n", … … 302 293 data->tds[td_current].next, data->tds[td_current].be); 303 294 304 transfer_buffer += transfer_size;295 buffer += transfer_size; 305 296 remain_size -= transfer_size; 306 297 assert(td_current < data->td_count); -
uspace/drv/ohci/hc.c
r1324ff3 r4deca9b 55 55 assert(hub_fun); 56 56 57 int ret; 58 57 59 usb_address_t hub_address = 58 60 device_keeper_get_free_address(&instance->manager, USB_SPEED_FULL); 61 if (hub_address <= 0) { 62 usb_log_error("Failed to get OHCI root hub address.\n"); 63 return hub_address; 64 } 59 65 instance->rh.address = hub_address; 60 66 usb_device_keeper_bind( 61 67 &instance->manager, hub_address, hub_fun->handle); 62 68 63 endpoint_t *ep = malloc(sizeof(endpoint_t)); 64 assert(ep); 65 int ret = endpoint_init(ep, hub_address, 0, USB_DIRECTION_BOTH, 66 USB_TRANSFER_CONTROL, USB_SPEED_FULL, 64); 67 assert(ret == EOK); 68 ret = usb_endpoint_manager_register_ep(&instance->ep_manager, ep, 0); 69 assert(ret == EOK); 69 ret = usb_endpoint_manager_add_ep(&instance->ep_manager, 70 hub_address, 0, USB_DIRECTION_BOTH, USB_TRANSFER_CONTROL, 71 USB_SPEED_FULL, 64, 0); 72 if (ret != EOK) { 73 usb_log_error("Failed to add OHCI rh endpoint 0.\n"); 74 usb_device_keeper_release(&instance->manager, hub_address); 75 return ret; 76 } 70 77 71 78 char *match_str = NULL; 79 /* DDF needs heap allocated string */ 72 80 ret = asprintf(&match_str, "usb&class=hub"); 73 // ret = (match_str == NULL) ? ret : EOK;74 81 if (ret < 0) { 75 82 usb_log_error( 76 83 "Failed(%d) to create root hub match-id string.\n", ret); 84 usb_device_keeper_release(&instance->manager, hub_address); 77 85 return ret; 78 86 } … … 80 88 ret = ddf_fun_add_match_id(hub_fun, match_str, 100); 81 89 if (ret != EOK) { 82 usb_log_error("Failed add createroot hub match-id.\n");90 usb_log_error("Failed add root hub match-id.\n"); 83 91 } 84 92 return ret; … … 115 123 fibril_mutex_initialize(&instance->guard); 116 124 117 rh_init(&instance->rh, dev,instance->registers);125 rh_init(&instance->rh, instance->registers); 118 126 119 127 if (!interrupts) { … … 130 138 assert(instance); 131 139 assert(batch); 140 assert(batch->ep); 132 141 133 142 /* check for root hub communication */ 134 if (batch-> target.address == instance->rh.address) {143 if (batch->ep->address == instance->rh.address) { 135 144 return rh_request(&instance->rh, batch); 136 145 } 137 146 138 147 fibril_mutex_lock(&instance->guard); 139 switch (batch-> transfer_type) {148 switch (batch->ep->transfer_type) { 140 149 case USB_TRANSFER_CONTROL: 141 150 instance->registers->control &= ~C_CLE; 142 151 transfer_list_add_batch( 143 instance->transfers[batch-> transfer_type], batch);152 instance->transfers[batch->ep->transfer_type], batch); 144 153 instance->registers->command_status |= CS_CLF; 145 154 usb_log_debug2("Set CS control transfer filled: %x.\n", … … 151 160 instance->registers->control &= ~C_BLE; 152 161 transfer_list_add_batch( 153 instance->transfers[batch-> transfer_type], batch);162 instance->transfers[batch->ep->transfer_type], batch); 154 163 instance->registers->command_status |= CS_BLF; 155 164 usb_log_debug2("Set bulk transfer filled: %x.\n", … … 161 170 instance->registers->control &= (~C_PLE & ~C_IE); 162 171 transfer_list_add_batch( 163 instance->transfers[batch-> transfer_type], batch);172 instance->transfers[batch->ep->transfer_type], batch); 164 173 instance->registers->control |= C_PLE | C_IE; 165 174 usb_log_debug2("Added periodic transfer: %x.\n", -
uspace/drv/ohci/root_hub.c
r1324ff3 r4deca9b 205 205 * @return Error code. 206 206 */ 207 int rh_init(rh_t *instance, ddf_dev_t *dev,ohci_regs_t *regs) {207 int rh_init(rh_t *instance, ohci_regs_t *regs) { 208 208 assert(instance); 209 //instance->address = -1;210 209 instance->registers = regs; 211 instance->device = dev;212 210 instance->port_count = 213 211 (instance->registers->rh_desc_a >> RHDA_NDS_SHIFT) & RHDA_NDS_MASK; 214 212 rh_init_descriptors(instance); 215 213 // set port power mode to no-power-switching 216 instance->registers->rh_desc_a = 217 instance->registers->rh_desc_a | (1<<9); 214 instance->registers->rh_desc_a |= RHDA_NPS_FLAG; 218 215 219 216 usb_log_info("OHCI root hub with %d ports.\n", instance->port_count); 220 221 //start generic usb hub driver222 223 /* TODO: implement */224 217 return EOK; 225 218 } … … 237 230 assert(request); 238 231 int opResult; 239 if (request-> transfer_type == USB_TRANSFER_CONTROL) {232 if (request->ep->transfer_type == USB_TRANSFER_CONTROL) { 240 233 usb_log_info("Root hub got CONTROL packet\n"); 241 234 opResult = process_ctrl_request(instance, request); 242 } else if (request-> transfer_type == USB_TRANSFER_INTERRUPT) {235 } else if (request->ep->transfer_type == USB_TRANSFER_INTERRUPT) { 243 236 usb_log_info("Root hub got INTERRUPT packet\n"); 244 237 void * buffer; 245 238 create_interrupt_mask(instance, &buffer, 246 239 &(request->transfered_size)); 247 memcpy(request-> transport_buffer, buffer,240 memcpy(request->data_buffer, buffer, 248 241 request->transfered_size); 249 242 opResult = EOK; … … 374 367 if (port < 1 || port > instance->port_count) 375 368 return EINVAL; 376 uint32_t * uint32_buffer = (uint32_t*) request-> transport_buffer;369 uint32_t * uint32_buffer = (uint32_t*) request->data_buffer; 377 370 request->transfered_size = 4; 378 371 uint32_buffer[0] = instance->registers->rh_port_status[port - 1]; … … 400 393 static int process_get_hub_status_request(rh_t *instance, 401 394 usb_transfer_batch_t * request) { 402 uint32_t * uint32_buffer = (uint32_t*) request-> transport_buffer;395 uint32_t * uint32_buffer = (uint32_t*) request->data_buffer; 403 396 request->transfered_size = 4; 404 397 //bits, 0,1,16,17 … … 550 543 } 551 544 request->transfered_size = size; 552 memcpy(request-> transport_buffer, result_descriptor, size);545 memcpy(request->data_buffer, result_descriptor, size); 553 546 if (del) 554 547 free(result_descriptor); … … 571 564 if (request->buffer_size != 1) 572 565 return EINVAL; 573 request-> transport_buffer[0] = 1;566 request->data_buffer[0] = 1; 574 567 request->transfered_size = 1; 575 568 return EOK; -
uspace/drv/ohci/root_hub.h
r1324ff3 r4deca9b 50 50 /** usb address of the root hub */ 51 51 usb_address_t address; 52 /** ddf device information */53 ddf_dev_t *device;54 52 /** hub port count */ 55 53 int port_count; … … 58 56 } rh_t; 59 57 60 int rh_init(rh_t *instance, ddf_dev_t *dev,ohci_regs_t *regs);58 int rh_init(rh_t *instance, ohci_regs_t *regs); 61 59 62 60 int rh_request(rh_t *instance, usb_transfer_batch_t *request);
Note:
See TracChangeset
for help on using the changeset viewer.
