Changeset 4971812 in mainline


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.

Location:
uspace
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/virtusbkbd/virtusbkbd.c

    r6c1315b r4971812  
    4646
    4747#include <usb/hcd.h>
     48#include <usb/device.h>
    4849#include <usbvirt/device.h>
    4950#include <usbvirt/hub.h>
     
    6970}
    7071
     72static usb_standard_device_descriptor_t std_descriptor = {
     73        .length = sizeof(usb_standard_device_descriptor_t),
     74        .descriptor_type = 1,
     75        .usb_spec_version = 0x110,
     76        .device_class = 0x03,
     77        .device_subclass = 0,
     78        .device_protocol = 0,
     79        .max_packet_size = 64,
     80        .configuration_count = 1
     81};
     82
    7183/** Keyboard callbacks.
    7284 * We abuse the fact that static variables are zero-filled.
     
    8193static usbvirt_device_t keyboard_dev = {
    8294        .ops = &keyboard_ops,
     95        .standard_descriptor = &std_descriptor,
    8396        .device_id_ = USBVIRT_DEV_KEYBOARD_ID
    8497};
  • uspace/lib/usbvirt/Makefile

    r6c1315b r4971812  
    3636        ctrlpipe.c \
    3737        incoming.c \
    38         main.c
     38        main.c \
     39        stdreq.c
    3940
    4041include $(USPACE_PREFIX)/Makefile.common
  • 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}
  • uspace/lib/usbvirt/device.h

    r6c1315b r4971812  
    3737
    3838#include <usb/hcd.h>
     39#include <usb/device.h>
    3940#include <usb/devreq.h>
    4041
     
    4344typedef int (*usbvirt_on_devreq_t)(struct usbvirt_device *dev,
    4445    usb_direction_t, int recipient,
    45     usb_stddevreq_t, int value, int index, int length);
     46    uint8_t request, uint16_t value, uint16_t index, uint16_t length,
     47    uint8_t *remaining_data);
    4648
    4749typedef struct {
     
    6466            usb_endpoint_t endpoint, void *buffer, size_t size);
    6567       
     68       
     69       
     70        /* Device attributes. */
     71       
     72        /** Standard device descriptor.
     73         * If this descriptor is set (i.e. not NULL), the framework
     74         * automatically handles call for its retrieval.
     75         */
     76        usb_standard_device_descriptor_t *standard_descriptor;
     77       
     78       
     79        /* Private attributes. */
     80       
    6681        /** Phone to HC.
    6782         * @warning Do not change, this is private variable.
  • uspace/lib/usbvirt/private.h

    r6c1315b r4971812  
    4141extern usbvirt_device_t *device;
    4242
     43#define DEVICE_HAS_OP(dev, op) \
     44        ( \
     45                (  ((dev)->ops) != NULL  ) \
     46                && \
     47                (  ((dev)->ops->op) != NULL  ) \
     48        )
    4349
    4450int usbvirt_data_to_host(struct usbvirt_device *dev,
     
    4955int control_pipe(void *buffer, size_t size);
    5056
     57int handle_std_request(usb_direction_t direction, int recipient,
     58    uint16_t request, uint16_t value, uint16_t index, uint16_t length,
     59    uint8_t *remaining_data);
     60
    5161#endif
    5262/**
Note: See TracChangeset for help on using the changeset viewer.