Changeset 1a46610 in mainline for uspace/drv/ohci/batch.c


Ignore:
Timestamp:
2011-04-10T22:44:17Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6991188
Parents:
c7bdfa7 (diff), 26d46d2 (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.
Message:

OHCI prototype

Control transfers work, interrupt transfers freeze VirtualBox, bulk were not tested

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/ohci/batch.c

    rc7bdfa7 r1a46610  
    5151static void batch_control(usb_transfer_batch_t *instance,
    5252    usb_direction_t data_dir, usb_direction_t status_dir);
     53static void batch_data(usb_transfer_batch_t *instance);
    5354static void batch_call_in_and_dispose(usb_transfer_batch_t *instance);
    5455static void batch_call_out_and_dispose(usb_transfer_batch_t *instance);
     
    134135        assert(data);
    135136        size_t tds = data->td_count - 1;
    136         usb_log_debug2("Batch(%p) checking %d td(s) for completion.\n",
     137        usb_log_debug("Batch(%p) checking %d td(s) for completion.\n",
    137138            instance, tds);
     139        usb_log_debug("ED: %x:%x:%x:%x.\n",
     140            data->ed->status, data->ed->td_head, data->ed->td_tail,
     141            data->ed->next);
    138142        size_t i = 0;
    139143        for (; i < tds; ++i) {
     144                usb_log_debug("TD %d: %x:%x:%x:%x.\n", i,
     145                    data->tds[i].status, data->tds[i].cbp, data->tds[i].next,
     146                    data->tds[i].be);
    140147                if (!td_is_finished(&data->tds[i]))
    141148                        return false;
     
    177184        assert(instance->direction == USB_DIRECTION_IN);
    178185        instance->next_step = batch_call_in_and_dispose;
    179         /* TODO: implement */
     186        batch_data(instance);
    180187        usb_log_debug("Batch(%p) INTERRUPT IN initialized.\n", instance);
    181188}
     
    189196            instance->buffer_size);
    190197        instance->next_step = batch_call_out_and_dispose;
    191         /* TODO: implement */
     198        batch_data(instance);
    192199        usb_log_debug("Batch(%p) INTERRUPT OUT initialized.\n", instance);
    193200}
     
    198205        instance->direction = USB_DIRECTION_IN;
    199206        instance->next_step = batch_call_in_and_dispose;
    200         /* TODO: implement */
     207        batch_data(instance);
    201208        usb_log_debug("Batch(%p) BULK IN initialized.\n", instance);
    202209}
     
    207214        instance->direction = USB_DIRECTION_IN;
    208215        instance->next_step = batch_call_in_and_dispose;
    209         /* TODO: implement */
     216        batch_data(instance);
    210217        usb_log_debug("Batch(%p) BULK IN initialized.\n", instance);
    211218}
     
    268275}
    269276/*----------------------------------------------------------------------------*/
     277void batch_data(usb_transfer_batch_t *instance)
     278{
     279        assert(instance);
     280        ohci_batch_t *data = instance->private_data;
     281        assert(data);
     282        ed_init(data->ed, instance->ep);
     283        ed_add_tds(data->ed, &data->tds[0], &data->tds[data->td_count - 1]);
     284        usb_log_debug("Created ED(%p): %x:%x:%x:%x.\n", data->ed,
     285            data->ed->status, data->ed->td_tail, data->ed->td_head,
     286            data->ed->next);
     287
     288        /* data stage */
     289        size_t td_current = 1;
     290        size_t remain_size = instance->buffer_size;
     291        char *transfer_buffer = instance->transport_buffer;
     292        while (remain_size > 0) {
     293                size_t transfer_size = remain_size > OHCI_TD_MAX_TRANSFER ?
     294                    OHCI_TD_MAX_TRANSFER : remain_size;
     295
     296                td_init(&data->tds[td_current], instance->ep->direction,
     297                    transfer_buffer, transfer_size, -1);
     298                td_set_next(&data->tds[td_current], &data->tds[td_current + 1]);
     299                usb_log_debug("Created DATA TD: %x:%x:%x:%x.\n",
     300                    data->tds[td_current].status, data->tds[td_current].cbp,
     301                    data->tds[td_current].next, data->tds[td_current].be);
     302
     303                transfer_buffer += transfer_size;
     304                remain_size -= transfer_size;
     305                assert(td_current < data->td_count);
     306                ++td_current;
     307        }
     308}
     309/*----------------------------------------------------------------------------*/
    270310/** Helper function calls callback and correctly disposes of batch structure.
    271311 *
Note: See TracChangeset for help on using the changeset viewer.