Changeset c15070c in mainline


Ignore:
Timestamp:
2011-03-21T10:54:23Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bab71635
Parents:
79c8a96
Message:

Fix toggle protocol, add support for all 32 endpoints

Location:
uspace
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/uhci-hcd/batch.c

    r79c8a96 rc15070c  
    183183
    184184                        device_keeper_set_toggle(data->manager,
    185                             instance->target, td_toggle(&data->tds[i]));
     185                            instance->target, instance->direction,
     186                            td_toggle(&data->tds[i]));
    186187                        if (i > 0)
    187188                                goto substract_ret;
     
    238239{
    239240        assert(instance);
     241        instance->direction = USB_DIRECTION_IN;
    240242        batch_data(instance, USB_PID_IN);
    241243        instance->next_step = batch_call_in_and_dispose;
     
    252254{
    253255        assert(instance);
     256        instance->direction = USB_DIRECTION_OUT;
    254257        /* We are data out, we are supposed to provide data */
    255258        memcpy(instance->transport_buffer, instance->buffer,
     
    270273        assert(instance);
    271274        batch_data(instance, USB_PID_IN);
     275        instance->direction = USB_DIRECTION_IN;
    272276        instance->next_step = batch_call_in_and_dispose;
    273277        usb_log_debug("Batch(%p) BULK IN initialized.\n", instance);
     
    283287{
    284288        assert(instance);
     289        instance->direction = USB_DIRECTION_OUT;
    285290        /* We are data out, we are supposed to provide data */
    286291        memcpy(instance->transport_buffer, instance->buffer,
     
    306311
    307312        const bool low_speed = instance->speed == USB_SPEED_LOW;
    308         int toggle = device_keeper_get_toggle(data->manager, instance->target);
     313        int toggle = device_keeper_get_toggle(
     314            data->manager, instance->target, instance->direction);
    309315        assert(toggle == 0 || toggle == 1);
    310316
     
    337343        }
    338344        td_set_ioc(&data->tds[packet - 1]);
    339         device_keeper_set_toggle(data->manager, instance->target, toggle);
     345        device_keeper_set_toggle(data->manager, instance->target,
     346            instance->direction, toggle);
    340347}
    341348/*----------------------------------------------------------------------------*/
  • uspace/lib/usb/include/usb/host/batch.h

    r79c8a96 rc15070c  
    4646        usb_transfer_type_t transfer_type;
    4747        usb_speed_t speed;
     48        usb_direction_t direction;
    4849        usbhc_iface_transfer_in_callback_t callback_in;
    4950        usbhc_iface_transfer_out_callback_t callback_out;
  • uspace/lib/usb/include/usb/host/device_keeper.h

    r79c8a96 rc15070c  
    4444        usb_speed_t speed;
    4545        bool occupied;
    46         uint16_t toggle_status;
     46        uint16_t toggle_status[2];
    4747        devman_handle_t handle;
    4848};
     
    6363
    6464void device_keeper_reset_if_need(
    65     device_keeper_t *instance, usb_target_t target, const unsigned char *setup_data);
     65    device_keeper_t *instance, usb_target_t target,
     66    const unsigned char *setup_data);
    6667
    67 int device_keeper_get_toggle(device_keeper_t *instance, usb_target_t target);
     68int device_keeper_get_toggle(
     69    device_keeper_t *instance, usb_target_t target, usb_direction_t direction);
    6870
    69 int device_keeper_set_toggle(
    70     device_keeper_t *instance, usb_target_t target, bool toggle);
     71int device_keeper_set_toggle(device_keeper_t *instance,
     72    usb_target_t target, usb_direction_t direction, bool toggle);
    7173
    7274usb_address_t device_keeper_request(
  • uspace/lib/usb/src/host/batch.c

    r79c8a96 rc15070c  
    6262        instance->transfer_type = transfer_type;
    6363        instance->speed = speed;
     64        instance->direction = USB_DIRECTION_BOTH;
    6465        instance->callback_in = func_in;
    6566        instance->callback_out = func_out;
  • uspace/lib/usb/src/host/device_keeper.c

    r79c8a96 rc15070c  
    5555                instance->devices[i].occupied = false;
    5656                instance->devices[i].handle = 0;
    57                 instance->devices[i].toggle_status = 0;
     57                instance->devices[i].toggle_status[0] = 0;
     58                instance->devices[i].toggle_status[1] = 0;
    5859        }
    5960}
     
    118119                if (((data[0] & 0xf) == 1) && ((data[2] | data[3]) == 0)) {
    119120                        /* endpoint number is < 16, thus first byte is enough */
    120                         instance->devices[target.address].toggle_status &=
     121                        instance->devices[target.address].toggle_status[0] &=
     122                            ~(1 << data[4]);
     123                        instance->devices[target.address].toggle_status[1] &=
    121124                            ~(1 << data[4]);
    122125                }
     
    127130                /* target must be device */
    128131                if ((data[0] & 0xf) == 0) {
    129                         instance->devices[target.address].toggle_status = 0;
     132                        instance->devices[target.address].toggle_status[0] = 0;
     133                        instance->devices[target.address].toggle_status[1] = 0;
    130134                }
    131135        break;
     
    140144 * @return Error code
    141145 */
    142 int device_keeper_get_toggle(device_keeper_t *instance, usb_target_t target)
    143 {
    144         assert(instance);
     146int device_keeper_get_toggle(
     147    device_keeper_t *instance, usb_target_t target, usb_direction_t direction)
     148{
     149        assert(instance);
     150        /* only control pipes are bi-directional and those do not need toggle */
     151        if (direction == USB_DIRECTION_BOTH)
     152                return ENOENT;
    145153        int ret;
    146154        fibril_mutex_lock(&instance->guard);
     
    151159                ret = EINVAL;
    152160        } else {
    153                 ret = (instance->devices[target.address].toggle_status
     161                ret = (instance->devices[target.address].toggle_status[direction]
    154162                        >> target.endpoint) & 1;
    155163        }
     
    165173 * @return Error code.
    166174 */
    167 int device_keeper_set_toggle(
    168     device_keeper_t *instance, usb_target_t target, bool toggle)
    169 {
    170         assert(instance);
     175int device_keeper_set_toggle(device_keeper_t *instance,
     176    usb_target_t target, usb_direction_t direction, bool toggle)
     177{
     178        assert(instance);
     179        /* only control pipes are bi-directional and those do not need toggle */
     180        if (direction == USB_DIRECTION_BOTH)
     181                return ENOENT;
    171182        int ret;
    172183        fibril_mutex_lock(&instance->guard);
     
    178189        } else {
    179190                if (toggle) {
    180                         instance->devices[target.address].toggle_status |= (1 << target.endpoint);
     191                        instance->devices[target.address].toggle_status[direction]
     192                            |= (1 << target.endpoint);
    181193                } else {
    182                         instance->devices[target.address].toggle_status &= ~(1 << target.endpoint);
     194                        instance->devices[target.address].toggle_status[direction]
     195                            &= ~(1 << target.endpoint);
    183196                }
    184197                ret = EOK;
     
    215228        instance->devices[new_address].occupied = true;
    216229        instance->devices[new_address].speed = speed;
    217         instance->devices[new_address].toggle_status = 0;
     230        instance->devices[new_address].toggle_status[0] = 0;
     231        instance->devices[new_address].toggle_status[1] = 0;
    218232        instance->last_address = new_address;
    219233        fibril_mutex_unlock(&instance->guard);
Note: See TracChangeset for help on using the changeset viewer.