Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/drv/include/usbhc_iface.h

    r1d758fc rb7fd2a0  
    11/*
    22 * Copyright (c) 2010 Vojtech Horky
    3  * Copyright (c) 2017 Ondrej Hlavaty
     3 * Copyright (c) 2011 Jan Vesely
    44 * All rights reserved.
    55 *
     
    3232 * @{
    3333 */
     34
    3435/** @file
    35  * @brief USB host controler interface definition. This is the interface of
    36  * USB host controller function, which can be used by usb device drivers.
     36 * @brief USB host controller interface definition.
    3737 */
    3838
     
    4141
    4242#include "ddf/driver.h"
    43 #include <async.h>
     43#include <usb_iface.h>
     44#include <stdbool.h>
    4445
    45 /** USB speeds. */
    46 typedef enum {
    47         /** USB 1.1 low speed (1.5Mbits/s). */
    48         USB_SPEED_LOW,
    49         /** USB 1.1 full speed (12Mbits/s). */
    50         USB_SPEED_FULL,
    51         /** USB 2.0 high speed (480Mbits/s). */
    52         USB_SPEED_HIGH,
    53         /** USB 3.0 super speed (5Gbits/s). */
    54         USB_SPEED_SUPER,
    55         /** Psuedo-speed serving as a boundary. */
    56         USB_SPEED_MAX
    57 } usb_speed_t;
     46extern errno_t usbhc_read(async_exch_t *, usb_address_t, usb_endpoint_t,
     47    uint64_t, void *, size_t, size_t *);
     48extern errno_t usbhc_write(async_exch_t *, usb_address_t, usb_endpoint_t,
     49    uint64_t, const void *, size_t);
    5850
    59 /** USB endpoint number type.
    60  * Negative values could be used to indicate error.
    61  */
    62 typedef uint16_t usb_endpoint_t;
     51/** Callback for outgoing transfer. */
     52typedef void (*usbhc_iface_transfer_out_callback_t)(errno_t, void *);
    6353
    64 /** USB address type.
    65  * Negative values could be used to indicate error.
    66  */
    67 typedef uint16_t usb_address_t;
     54/** Callback for incoming transfer. */
     55typedef void (*usbhc_iface_transfer_in_callback_t)(errno_t, size_t, void *);
    6856
    69 /**
    70  * USB Stream ID type.
    71  */
    72 typedef uint16_t usb_stream_t;
     57/** USB host controller communication interface. */
     58typedef struct {
     59        errno_t (*read)(ddf_fun_t *, usb_target_t, uint64_t, uint8_t *, size_t,
     60            usbhc_iface_transfer_in_callback_t, void *);
     61        errno_t (*write)(ddf_fun_t *, usb_target_t, uint64_t, const uint8_t *,
     62            size_t, usbhc_iface_transfer_out_callback_t, void *);
     63} usbhc_iface_t;
    7364
    74 /** USB transfer type. */
    75 typedef enum {
    76         USB_TRANSFER_CONTROL = 0,
    77         USB_TRANSFER_ISOCHRONOUS = 1,
    78         USB_TRANSFER_BULK = 2,
    79         USB_TRANSFER_INTERRUPT = 3,
    80 } usb_transfer_type_t;
    81 
    82 #define USB_TRANSFER_COUNT  (USB_TRANSFER_INTERRUPT + 1)
    83 
    84 /** USB data transfer direction. */
    85 typedef enum {
    86         USB_DIRECTION_IN,
    87         USB_DIRECTION_OUT,
    88         USB_DIRECTION_BOTH,
    89 } usb_direction_t;
    90 
    91 #define USB_DIRECTION_COUNT  (USB_DIRECTION_BOTH + 1)
    92 
    93 /** USB complete address type.
    94  * Pair address + endpoint is identification of transaction recipient.
    95  */
    96 typedef union {
    97         struct {
    98                 usb_address_t address;
    99                 usb_endpoint_t endpoint;
    100                 usb_stream_t stream;
    101         } __attribute__((packed));
    102         uint64_t packed;
    103 } usb_target_t;
    104 
    105 // FIXME: DMA buffers shall be part of libdrv anyway.
    106 typedef uintptr_t dma_policy_t;
    107 
    108 typedef struct dma_buffer {
    109         void *virt;
    110         dma_policy_t policy;
    111 } dma_buffer_t;
    112 
    113 typedef struct usb_pipe_desc {
    114         /** Endpoint number. */
    115         usb_endpoint_t endpoint_no;
    116 
    117         /** Endpoint transfer type. */
    118         usb_transfer_type_t transfer_type;
    119 
    120         /** Endpoint direction. */
    121         usb_direction_t direction;
    122 
    123         /**
    124          * Maximum size of one transfer. Non-periodic endpoints may handle
    125          * bigger transfers, but those can be split into multiple USB transfers.
    126          */
    127         size_t max_transfer_size;
    128 
    129         /** Constraints on buffers to be transferred without copying */
    130         dma_policy_t transfer_buffer_policy;
    131 } usb_pipe_desc_t;
    132 
    133 typedef struct usb_pipe_transfer_request {
    134         usb_direction_t dir;
    135         usb_endpoint_t endpoint;
    136         usb_stream_t stream;
    137 
    138         uint64_t setup;                 /**< Valid iff the transfer is of control type */
    139 
    140         /**
    141          * The DMA buffer to share. Must be at least offset + size large. Is
    142          * patched after being transmitted over IPC, so the pointer is still
    143          * valid.
    144          */
    145         dma_buffer_t buffer;
    146         size_t offset;                  /**< Offset to the buffer */
    147         size_t size;                    /**< Requested size. */
    148 } usbhc_iface_transfer_request_t;
    149 
    150 /** This structure follows standard endpoint descriptor + superspeed companion
    151  * descriptor, and exists to avoid dependency of libdrv on libusb. Keep the
    152  * internal fields named exactly like their source (because we want to use the
    153  * same macros to access them).
    154  * Callers shall fill it with bare contents of respective descriptors (in usb endianity).
    155  */
    156 typedef struct usb_endpoint_descriptors {
    157         struct {
    158                 uint8_t endpoint_address;
    159                 uint8_t attributes;
    160                 uint16_t max_packet_size;
    161                 uint8_t poll_interval;
    162         } endpoint;
    163 
    164         /* Superspeed companion descriptor */
    165         struct companion_desc_t {
    166                 uint8_t max_burst;
    167                 uint8_t attributes;
    168                 uint16_t bytes_per_interval;
    169         } companion;
    170 } usb_endpoint_descriptors_t;
    171 
    172 extern errno_t usbhc_reserve_default_address(async_exch_t *);
    173 extern errno_t usbhc_release_default_address(async_exch_t *);
    174 
    175 extern errno_t usbhc_device_enumerate(async_exch_t *, unsigned, usb_speed_t);
    176 extern errno_t usbhc_device_remove(async_exch_t *, unsigned);
    177 
    178 extern errno_t usbhc_register_endpoint(async_exch_t *, usb_pipe_desc_t *, const usb_endpoint_descriptors_t *);
    179 extern errno_t usbhc_unregister_endpoint(async_exch_t *, const usb_pipe_desc_t *);
    180 
    181 extern errno_t usbhc_transfer(async_exch_t *, const usbhc_iface_transfer_request_t *, size_t *);
    182 
    183 /** Callback for outgoing transfer */
    184 typedef errno_t (*usbhc_iface_transfer_callback_t)(void *, int, size_t);
    185 
    186 /** USB device communication interface. */
    187 typedef struct {
    188         errno_t (*default_address_reservation)(ddf_fun_t *, bool);
    189 
    190         errno_t (*device_enumerate)(ddf_fun_t *, unsigned, usb_speed_t);
    191         errno_t (*device_remove)(ddf_fun_t *, unsigned);
    192 
    193         errno_t (*register_endpoint)(ddf_fun_t *, usb_pipe_desc_t *, const usb_endpoint_descriptors_t *);
    194         errno_t (*unregister_endpoint)(ddf_fun_t *, const usb_pipe_desc_t *);
    195 
    196         errno_t (*transfer)(ddf_fun_t *, const usbhc_iface_transfer_request_t *,
    197             usbhc_iface_transfer_callback_t, void *);
    198 } usbhc_iface_t;
    19965
    20066#endif
Note: See TracChangeset for help on using the changeset viewer.