linux/include/uapi/linux/usb/functionfs.h
<<
>>
Prefs
   1#ifndef _UAPI__LINUX_FUNCTIONFS_H__
   2#define _UAPI__LINUX_FUNCTIONFS_H__
   3
   4
   5#include <linux/types.h>
   6#include <linux/ioctl.h>
   7
   8#include <linux/usb/ch9.h>
   9
  10
  11enum {
  12        FUNCTIONFS_DESCRIPTORS_MAGIC = 1,
  13        FUNCTIONFS_STRINGS_MAGIC     = 2
  14};
  15
  16
  17#ifndef __KERNEL__
  18
  19/* Descriptor of an non-audio endpoint */
  20struct usb_endpoint_descriptor_no_audio {
  21        __u8  bLength;
  22        __u8  bDescriptorType;
  23
  24        __u8  bEndpointAddress;
  25        __u8  bmAttributes;
  26        __le16 wMaxPacketSize;
  27        __u8  bInterval;
  28} __attribute__((packed));
  29
  30
  31/*
  32 * All numbers must be in little endian order.
  33 */
  34
  35struct usb_functionfs_descs_head {
  36        __le32 magic;
  37        __le32 length;
  38        __le32 fs_count;
  39        __le32 hs_count;
  40} __attribute__((packed));
  41
  42/*
  43 * Descriptors format:
  44 *
  45 * | off | name      | type         | description                          |
  46 * |-----+-----------+--------------+--------------------------------------|
  47 * |   0 | magic     | LE32         | FUNCTIONFS_{FS,HS}_DESCRIPTORS_MAGIC |
  48 * |   4 | length    | LE32         | length of the whole data chunk       |
  49 * |   8 | fs_count  | LE32         | number of full-speed descriptors     |
  50 * |  12 | hs_count  | LE32         | number of high-speed descriptors     |
  51 * |  16 | fs_descrs | Descriptor[] | list of full-speed descriptors       |
  52 * |     | hs_descrs | Descriptor[] | list of high-speed descriptors       |
  53 *
  54 * descs are just valid USB descriptors and have the following format:
  55 *
  56 * | off | name            | type | description              |
  57 * |-----+-----------------+------+--------------------------|
  58 * |   0 | bLength         | U8   | length of the descriptor |
  59 * |   1 | bDescriptorType | U8   | descriptor type          |
  60 * |   2 | payload         |      | descriptor's payload     |
  61 */
  62
  63struct usb_functionfs_strings_head {
  64        __le32 magic;
  65        __le32 length;
  66        __le32 str_count;
  67        __le32 lang_count;
  68} __attribute__((packed));
  69
  70/*
  71 * Strings format:
  72 *
  73 * | off | name       | type                  | description                |
  74 * |-----+------------+-----------------------+----------------------------|
  75 * |   0 | magic      | LE32                  | FUNCTIONFS_STRINGS_MAGIC   |
  76 * |   4 | length     | LE32                  | length of the data chunk   |
  77 * |   8 | str_count  | LE32                  | number of strings          |
  78 * |  12 | lang_count | LE32                  | number of languages        |
  79 * |  16 | stringtab  | StringTab[lang_count] | table of strings per lang  |
  80 *
  81 * For each language there is one stringtab entry (ie. there are lang_count
  82 * stringtab entires).  Each StringTab has following format:
  83 *
  84 * | off | name    | type              | description                        |
  85 * |-----+---------+-------------------+------------------------------------|
  86 * |   0 | lang    | LE16              | language code                      |
  87 * |   2 | strings | String[str_count] | array of strings in given language |
  88 *
  89 * For each string there is one strings entry (ie. there are str_count
  90 * string entries).  Each String is a NUL terminated string encoded in
  91 * UTF-8.
  92 */
  93
  94#endif
  95
  96
  97/*
  98 * Events are delivered on the ep0 file descriptor, when the user mode driver
  99 * reads from this file descriptor after writing the descriptors.  Don't
 100 * stop polling this descriptor.
 101 */
 102
 103enum usb_functionfs_event_type {
 104        FUNCTIONFS_BIND,
 105        FUNCTIONFS_UNBIND,
 106
 107        FUNCTIONFS_ENABLE,
 108        FUNCTIONFS_DISABLE,
 109
 110        FUNCTIONFS_SETUP,
 111
 112        FUNCTIONFS_SUSPEND,
 113        FUNCTIONFS_RESUME
 114};
 115
 116/* NOTE:  this structure must stay the same size and layout on
 117 * both 32-bit and 64-bit kernels.
 118 */
 119struct usb_functionfs_event {
 120        union {
 121                /* SETUP: packet; DATA phase i/o precedes next event
 122                 *(setup.bmRequestType & USB_DIR_IN) flags direction */
 123                struct usb_ctrlrequest  setup;
 124        } __attribute__((packed)) u;
 125
 126        /* enum usb_functionfs_event_type */
 127        __u8                            type;
 128        __u8                            _pad[3];
 129} __attribute__((packed));
 130
 131
 132/* Endpoint ioctls */
 133/* The same as in gadgetfs */
 134
 135/* IN transfers may be reported to the gadget driver as complete
 136 *      when the fifo is loaded, before the host reads the data;
 137 * OUT transfers may be reported to the host's "client" driver as
 138 *      complete when they're sitting in the FIFO unread.
 139 * THIS returns how many bytes are "unclaimed" in the endpoint fifo
 140 * (needed for precise fault handling, when the hardware allows it)
 141 */
 142#define FUNCTIONFS_FIFO_STATUS  _IO('g', 1)
 143
 144/* discards any unclaimed data in the fifo. */
 145#define FUNCTIONFS_FIFO_FLUSH   _IO('g', 2)
 146
 147/* resets endpoint halt+toggle; used to implement set_interface.
 148 * some hardware (like pxa2xx) can't support this.
 149 */
 150#define FUNCTIONFS_CLEAR_HALT   _IO('g', 3)
 151
 152/* Specific for functionfs */
 153
 154/*
 155 * Returns reverse mapping of an interface.  Called on EP0.  If there
 156 * is no such interface returns -EDOM.  If function is not active
 157 * returns -ENODEV.
 158 */
 159#define FUNCTIONFS_INTERFACE_REVMAP     _IO('g', 128)
 160
 161/*
 162 * Returns real bEndpointAddress of an endpoint.  If function is not
 163 * active returns -ENODEV.
 164 */
 165#define FUNCTIONFS_ENDPOINT_REVMAP      _IO('g', 129)
 166
 167
 168
 169#endif /* _UAPI__LINUX_FUNCTIONFS_H__ */
 170