Changeset 4971812 in mainline for uspace/lib/usbvirt/ctrlpipe.c


Ignore:
Timestamp:
2010-10-10T21:20:02Z (14 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0e41957
Parents:
6c1315b
Message:

Standard requests in virtual USB device

The virtual USB device framework can handle some standard requests
alone. Again, this is more about bones than about meat. Meat will
come later.

Update `vuk' app to provide standard device descriptor.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbvirt/ctrlpipe.c

    r6c1315b r4971812  
    3737#include "private.h"
    3838
     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
     47static 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
     53static int request_get_type(uint8_t request_type)
     54{
     55        return GET_MIDBITS(request_type, 2, 5);
     56}
     57
     58static int request_get_recipient(uint8_t request_type)
     59{
     60        return GET_MIDBITS(request_type, 5, 0);
     61}
     62
     63
     64typedef 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
    3972int control_pipe(void *buffer, size_t size)
    4073{
    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       
    42106        return EOK;
    43107}
Note: See TracChangeset for help on using the changeset viewer.