Changeset 11658b64 in mainline for uspace/lib/usbvirt


Ignore:
Timestamp:
2010-12-16T11:54:53Z (15 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
557c7d0, 5863a95, 82122f3, a8b7dfd, f2962621
Parents:
a9b6bec (diff), 70e5ad5 (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:

Merged vojtechhorky/ - libusbvirt clean-up

Location:
uspace/lib/usbvirt
Files:
1 added
1 deleted
1 edited
8 moved

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbvirt/Makefile

    ra9b6bec r11658b64  
    3131
    3232LIBS = $(LIBUSB_PREFIX)/libusb.a
    33 EXTRA_CFLAGS = -I$(LIBUSB_PREFIX)/include
     33EXTRA_CFLAGS = -I$(LIBUSB_PREFIX)/include -Iinclude
    3434
    3535SOURCES = \
    36         callback.c \
    37         ctrlpipe.c \
    38         debug.c \
    39         main.c \
    40         stdreq.c \
    41         transaction.c
     36        src/callback.c \
     37        src/ctrlpipe.c \
     38        src/debug.c \
     39        src/main.c \
     40        src/stdreq.c \
     41        src/transaction.c
    4242
    4343include $(USPACE_PREFIX)/Makefile.common
  • uspace/lib/usbvirt/include/usbvirt/device.h

    ra9b6bec r11658b64  
    4040#include <usb/devreq.h>
    4141
     42/** Request type of a control transfer. */
     43typedef enum {
     44        /** Standard USB request. */
     45        USBVIRT_REQUEST_TYPE_STANDARD = 0,
     46        /** Standard class USB request. */
     47        USBVIRT_REQUEST_TYPE_CLASS = 1
     48} usbvirt_request_type_t;
     49
     50/** Recipient of control request. */
     51typedef enum {
     52        /** Device is the recipient of the control request. */
     53        USBVIRT_REQUEST_RECIPIENT_DEVICE = 0,
     54        /** Interface is the recipient of the control request. */
     55        USBVIRT_REQUEST_RECIPIENT_INTERFACE = 1,
     56        /** Endpoint is the recipient of the control request. */
     57        USBVIRT_REQUEST_RECIPIENT_ENDPOINT = 2,
     58        /** Other part of the device is the recipient of the control request. */
     59        USBVIRT_REQUEST_RECIPIENT_OTHER = 3
     60} usbvirt_request_recipient_t;
     61
     62/** Possible states of virtual USB device.
     63 * Notice that these are not 1:1 mappings to those in USB specification.
     64 */
     65typedef enum {
     66        /** Default state, device listens at default address. */
     67        USBVIRT_STATE_DEFAULT,
     68        /** Device has non-default address assigned. */
     69        USBVIRT_STATE_ADDRESS,
     70        /** Device is configured. */
     71        USBVIRT_STATE_CONFIGURED
     72} usbvirt_device_state_t;
     73
    4274typedef struct usbvirt_device usbvirt_device_t;
    4375struct usbvirt_control_transfer;
     
    4779        uint8_t *data);
    4880
    49 /** Callbacks for standard device requests.
    50  * When these functions are NULL or return EFORWARD, this
    51  * framework will try to satisfy the request by itself.
    52  */
    53 typedef struct {
    54         usbvirt_on_device_request_t on_get_status;
    55         usbvirt_on_device_request_t on_clear_feature;
    56         usbvirt_on_device_request_t on_set_feature;
    57         usbvirt_on_device_request_t on_set_address;
    58         usbvirt_on_device_request_t on_get_descriptor;
    59         usbvirt_on_device_request_t on_set_descriptor;
    60         usbvirt_on_device_request_t on_get_configuration;
    61         usbvirt_on_device_request_t on_set_configuration;
    62         usbvirt_on_device_request_t on_get_interface;
    63         usbvirt_on_device_request_t on_set_interface;
    64         usbvirt_on_device_request_t on_synch_frame;
    65 } usbvirt_standard_device_request_ops_t;
     81/** Callback for control request over pipe zero.
     82 *
     83 * @param dev Virtual device answering the call.
     84 * @param request Request setup packet.
     85 * @param data Data when DATA stage is present.
     86 * @return Error code.
     87 */
     88typedef int (*usbvirt_control_request_callback_t)(usbvirt_device_t *dev,
     89        usb_device_request_setup_packet_t *request,
     90        uint8_t *data);
     91
     92/** Handler for control transfer on endpoint zero. */
     93typedef struct {
     94        /** Request type bitmap.
     95         * Use USBVIRT_MAKE_CONTROL_REQUEST_TYPE for creating the bitmap.
     96         */
     97        uint8_t request_type;
     98        /** Request code. */
     99        uint8_t request;
     100        /** Request name for debugging. */
     101        const char *name;
     102        /** Callback for the request.
     103         * NULL value here announces end of a list.
     104         */
     105        usbvirt_control_request_callback_t callback;
     106} usbvirt_control_transfer_handler_t;
     107
     108/** Create control request type bitmap.
     109 *
     110 * @param direction Transfer direction (use usb_direction_t).
     111 * @param type Request type (use usbvirt_request_type_t).
     112 * @param recipient Recipient of the request (use usbvirt_request_recipient_t).
     113 * @return Request type bitmap.
     114 */
     115#define USBVIRT_MAKE_CONTROL_REQUEST_TYPE(direction, type, recipient) \
     116        ((((direction) == USB_DIRECTION_IN) ? 1 : 0) << 7) \
     117        | (((type) & 3) << 5) \
     118        | (((recipient) & 31))
     119
     120/** Create last item in an array of control request handlers. */
     121#define USBVIRT_CONTROL_TRANSFER_HANDLER_LAST { 0, 0, NULL, NULL }
    66122
    67123/** Device operations. */
    68124typedef struct {
    69         /** Callbacks for standard deivce requests. */
    70         usbvirt_standard_device_request_ops_t *standard_request_ops;
    71         /** Callback for class-specific USB request. */
    72         usbvirt_on_device_request_t on_class_device_request;
    73        
     125        /** Callbacks for transfers over control pipe zero. */
     126        usbvirt_control_transfer_handler_t *control_transfer_handlers;
     127
    74128        int (*on_control_transfer)(usbvirt_device_t *dev,
    75129            usb_endpoint_t endpoint, struct usbvirt_control_transfer *transfer);
     
    86140        usb_direction_t (*decide_control_transfer_direction)(
    87141            usb_endpoint_t endpoint, void *buffer, size_t size);
     142
     143        /** Callback when device changes its state.
     144         *
     145         * It is correct that this function is called when both states
     146         * are equal (e.g. this function is called during SET_CONFIGURATION
     147         * request done on already configured device).
     148         *
     149         * @warning The value of <code>dev->state</code> before calling
     150         * this function is not specified (i.e. can be @p old_state or
     151         * @p new_state).
     152         */
     153        void (*on_state_change)(usbvirt_device_t *dev,
     154            usbvirt_device_state_t old_state, usbvirt_device_state_t new_state);
    88155} usbvirt_device_ops_t;
    89156
     
    120187        uint8_t current_configuration;
    121188} usbvirt_descriptors_t;
    122 
    123 /** Possible states of virtual USB device.
    124  * Notice that these are not 1:1 mappings to those in USB specification.
    125  */
    126 typedef enum {
    127         USBVIRT_STATE_DEFAULT,
    128         USBVIRT_STATE_ADDRESS,
    129         USBVIRT_STATE_CONFIGURED
    130 } usbvirt_device_state_t;
    131189
    132190/** Information about on-going control transfer.
     
    157215        usbvirt_device_ops_t *ops;
    158216       
     217        /** Custom device data. */
     218        void *device_data;
     219
    159220        /** Reply onto control transfer.
    160221         */
  • uspace/lib/usbvirt/src/callback.c

    ra9b6bec r11658b64  
    4040#include <mem.h>
    4141
    42 #include "hub.h"
    43 #include "device.h"
    4442#include "private.h"
    4543
  • uspace/lib/usbvirt/src/debug.c

    ra9b6bec r11658b64  
    3636#include <bool.h>
    3737
    38 #include "device.h"
    3938#include "private.h"
    4039
  • uspace/lib/usbvirt/src/main.c

    ra9b6bec r11658b64  
    3939#include <assert.h>
    4040
    41 #include "hub.h"
    42 #include "device.h"
    4341#include "private.h"
    4442
  • uspace/lib/usbvirt/src/private.h

    ra9b6bec r11658b64  
    3636#define LIBUSBVIRT_PRIVATE_H_
    3737
    38 #include "device.h"
    39 #include "hub.h"
     38#include <usbvirt/device.h>
     39#include <usbvirt/hub.h>
     40#include <assert.h>
    4041
    4142
     
    8687}
    8788
     89extern usbvirt_control_transfer_handler_t control_pipe_zero_local_handlers[];
     90
    8891#endif
    8992/**
  • uspace/lib/usbvirt/src/stdreq.c

    ra9b6bec r11658b64  
    4040#include "private.h"
    4141
    42 
    43 
    4442/*
    4543 * All sub handlers must return EFORWARD to inform the caller that
     
    5149/** GET_DESCRIPTOR handler. */
    5250static int handle_get_descriptor(usbvirt_device_t *device,
    53     uint8_t type, uint8_t index, uint16_t language,
    54     uint16_t length)
     51    usb_device_request_setup_packet_t *setup_packet, uint8_t *extra_data)
    5552{
     53        uint8_t type = setup_packet->value_high;
     54        uint8_t index = setup_packet->value_low;
     55
    5656        /*
    5757         * Standard device descriptor.
     
    110110/** SET_ADDRESS handler. */
    111111static int handle_set_address(usbvirt_device_t *device,
    112     uint16_t new_address,
    113     uint16_t zero1, uint16_t zero2)
     112    usb_device_request_setup_packet_t *setup_packet, uint8_t *extra_data)
    114113{
     114        uint16_t new_address = setup_packet->value;
     115        uint16_t zero1 = setup_packet->index;
     116        uint16_t zero2 = setup_packet->length;
     117
    115118        if ((zero1 != 0) || (zero2 != 0)) {
    116119                return EINVAL;
     
    128131/** SET_CONFIGURATION handler. */
    129132static int handle_set_configuration(usbvirt_device_t *device,
    130     uint16_t configuration_value,
    131     uint16_t zero1, uint16_t zero2)
     133    usb_device_request_setup_packet_t *setup_packet, uint8_t *extra_data)
    132134{
     135        uint16_t configuration_value = setup_packet->value;
     136        uint16_t zero1 = setup_packet->index;
     137        uint16_t zero2 = setup_packet->length;
     138
    133139        if ((zero1 != 0) || (zero2 != 0)) {
    134140                return EINVAL;
     
    151157       
    152158        if (configuration_value == 0) {
     159                if (DEVICE_HAS_OP(device, on_state_change)) {
     160                        device->ops->on_state_change(device, device->state,
     161                            USBVIRT_STATE_ADDRESS);
     162                }
    153163                device->state = USBVIRT_STATE_ADDRESS;
    154164        } else {
     
    157167                * user selected existing configuration.
    158168                */
     169                if (DEVICE_HAS_OP(device, on_state_change)) {
     170                        device->ops->on_state_change(device, device->state,
     171                            USBVIRT_STATE_CONFIGURED);
     172                }
    159173                device->state = USBVIRT_STATE_CONFIGURED;
    160174                if (device->descriptors) {
     
    167181}
    168182
    169 #define HANDLE_REQUEST(request, data, type, dev, user_callback, default_handler) \
    170         do { \
    171                 if ((request)->request == (type)) { \
    172                         int _rc = EFORWARD; \
    173                         if (((dev)->ops) && ((dev)->ops->standard_request_ops) \
    174                             && ((dev)->ops->standard_request_ops->user_callback)) { \
    175                                 _rc = (dev)->ops->standard_request_ops->\
    176                                     user_callback(dev, request, data); \
    177                         } \
    178                         if (_rc == EFORWARD) { \
    179                                 default_handler; \
    180                         } \
    181                         return _rc; \
    182                 } \
    183         } while (false)
    184 
    185 /** Handle standard device request. */
    186 int handle_std_request(usbvirt_device_t *device,
    187     usb_device_request_setup_packet_t *request, uint8_t *data)
    188 {
    189         device->lib_debug(device, 3, USBVIRT_DEBUGTAG_CONTROL_PIPE_ZERO,
    190             "handling standard request %d", request->request);
    191        
    192         HANDLE_REQUEST(request, data, USB_DEVREQ_GET_DESCRIPTOR,
    193             device, on_get_descriptor,
    194             handle_get_descriptor(device, request->value_high, request->value_low,
    195                 request->index, request->length));
    196        
    197         HANDLE_REQUEST(request, data, USB_DEVREQ_SET_ADDRESS,
    198             device, on_set_address,
    199             handle_set_address(device, request->value,
    200                 request->index, request->length));
    201        
    202         HANDLE_REQUEST(request, data, USB_DEVREQ_SET_CONFIGURATION,
    203             device, on_set_configuration,
    204             handle_set_configuration(device, request->value,
    205                 request->index, request->length));
    206        
    207         return ENOTSUP;
    208 }
     183
     184#define MAKE_BM_REQUEST(direction, recipient) \
     185        USBVIRT_MAKE_CONTROL_REQUEST_TYPE(direction, \
     186            USBVIRT_REQUEST_TYPE_STANDARD, recipient)
     187#define MAKE_BM_REQUEST_DEV(direction) \
     188        MAKE_BM_REQUEST(direction, USBVIRT_REQUEST_RECIPIENT_DEVICE)
     189
     190usbvirt_control_transfer_handler_t control_pipe_zero_local_handlers[] = {
     191        {
     192                .request_type = MAKE_BM_REQUEST_DEV(USB_DIRECTION_IN),
     193                .request = USB_DEVREQ_GET_DESCRIPTOR,
     194                .name = "GetDescriptor()",
     195                .callback = handle_get_descriptor
     196        },
     197        {
     198                .request_type = MAKE_BM_REQUEST_DEV(USB_DIRECTION_OUT),
     199                .request = USB_DEVREQ_SET_ADDRESS,
     200                .name = "SetAddress()",
     201                .callback = handle_set_address
     202        },
     203        {
     204                .request_type = MAKE_BM_REQUEST_DEV(USB_DIRECTION_OUT),
     205                .request = USB_DEVREQ_SET_CONFIGURATION,
     206                .name = "SetConfiguration()",
     207                .callback = handle_set_configuration
     208        },
     209        USBVIRT_CONTROL_TRANSFER_HANDLER_LAST
     210};
    209211
    210212/**
  • uspace/lib/usbvirt/src/transaction.c

    ra9b6bec r11658b64  
    3737#include <mem.h>
    3838
    39 #include "hub.h"
    4039#include "private.h"
    4140
Note: See TracChangeset for help on using the changeset viewer.