15e1ddb48SDavid Howells #ifndef _UAPI__LINUX_FUNCTIONFS_H__ 25e1ddb48SDavid Howells #define _UAPI__LINUX_FUNCTIONFS_H__ 35e1ddb48SDavid Howells 45e1ddb48SDavid Howells 55e1ddb48SDavid Howells #include <linux/types.h> 65e1ddb48SDavid Howells #include <linux/ioctl.h> 75e1ddb48SDavid Howells 85e1ddb48SDavid Howells #include <linux/usb/ch9.h> 95e1ddb48SDavid Howells 105e1ddb48SDavid Howells 115e1ddb48SDavid Howells enum { 125e1ddb48SDavid Howells FUNCTIONFS_DESCRIPTORS_MAGIC = 1, 13*ac8dde11SMichal Nazarewicz FUNCTIONFS_STRINGS_MAGIC = 2, 14*ac8dde11SMichal Nazarewicz FUNCTIONFS_DESCRIPTORS_MAGIC_V2 = 3, 155e1ddb48SDavid Howells }; 165e1ddb48SDavid Howells 17*ac8dde11SMichal Nazarewicz enum functionfs_flags { 18*ac8dde11SMichal Nazarewicz FUNCTIONFS_HAS_FS_DESC = 1, 19*ac8dde11SMichal Nazarewicz FUNCTIONFS_HAS_HS_DESC = 2, 20*ac8dde11SMichal Nazarewicz FUNCTIONFS_HAS_SS_DESC = 4, 21*ac8dde11SMichal Nazarewicz }; 225e1ddb48SDavid Howells 235e1ddb48SDavid Howells #ifndef __KERNEL__ 245e1ddb48SDavid Howells 255e1ddb48SDavid Howells /* Descriptor of an non-audio endpoint */ 265e1ddb48SDavid Howells struct usb_endpoint_descriptor_no_audio { 275e1ddb48SDavid Howells __u8 bLength; 285e1ddb48SDavid Howells __u8 bDescriptorType; 295e1ddb48SDavid Howells 305e1ddb48SDavid Howells __u8 bEndpointAddress; 315e1ddb48SDavid Howells __u8 bmAttributes; 325e1ddb48SDavid Howells __le16 wMaxPacketSize; 335e1ddb48SDavid Howells __u8 bInterval; 345e1ddb48SDavid Howells } __attribute__((packed)); 355e1ddb48SDavid Howells 365e1ddb48SDavid Howells 375e1ddb48SDavid Howells /* 385e1ddb48SDavid Howells * Descriptors format: 395e1ddb48SDavid Howells * 405e1ddb48SDavid Howells * | off | name | type | description | 415e1ddb48SDavid Howells * |-----+-----------+--------------+--------------------------------------| 42*ac8dde11SMichal Nazarewicz * | 0 | magic | LE32 | FUNCTIONFS_DESCRIPTORS_MAGIC_V2 | 43*ac8dde11SMichal Nazarewicz * | 4 | length | LE32 | length of the whole data chunk | 44*ac8dde11SMichal Nazarewicz * | 8 | flags | LE32 | combination of functionfs_flags | 45*ac8dde11SMichal Nazarewicz * | | fs_count | LE32 | number of full-speed descriptors | 46*ac8dde11SMichal Nazarewicz * | | hs_count | LE32 | number of high-speed descriptors | 47*ac8dde11SMichal Nazarewicz * | | ss_count | LE32 | number of super-speed descriptors | 48*ac8dde11SMichal Nazarewicz * | | fs_descrs | Descriptor[] | list of full-speed descriptors | 49*ac8dde11SMichal Nazarewicz * | | hs_descrs | Descriptor[] | list of high-speed descriptors | 50*ac8dde11SMichal Nazarewicz * | | ss_descrs | Descriptor[] | list of super-speed descriptors | 51*ac8dde11SMichal Nazarewicz * 52*ac8dde11SMichal Nazarewicz * Depending on which flags are set, various fields may be missing in the 53*ac8dde11SMichal Nazarewicz * structure. Any flags that are not recognised cause the whole block to be 54*ac8dde11SMichal Nazarewicz * rejected with -ENOSYS. 55*ac8dde11SMichal Nazarewicz * 56*ac8dde11SMichal Nazarewicz * Legacy descriptors format: 57*ac8dde11SMichal Nazarewicz * 58*ac8dde11SMichal Nazarewicz * | off | name | type | description | 59*ac8dde11SMichal Nazarewicz * |-----+-----------+--------------+--------------------------------------| 60*ac8dde11SMichal Nazarewicz * | 0 | magic | LE32 | FUNCTIONFS_DESCRIPTORS_MAGIC | 615e1ddb48SDavid Howells * | 4 | length | LE32 | length of the whole data chunk | 625e1ddb48SDavid Howells * | 8 | fs_count | LE32 | number of full-speed descriptors | 635e1ddb48SDavid Howells * | 12 | hs_count | LE32 | number of high-speed descriptors | 645e1ddb48SDavid Howells * | 16 | fs_descrs | Descriptor[] | list of full-speed descriptors | 655e1ddb48SDavid Howells * | | hs_descrs | Descriptor[] | list of high-speed descriptors | 665e1ddb48SDavid Howells * 67*ac8dde11SMichal Nazarewicz * All numbers must be in little endian order. 68*ac8dde11SMichal Nazarewicz * 69*ac8dde11SMichal Nazarewicz * Descriptor[] is an array of valid USB descriptors which have the following 70*ac8dde11SMichal Nazarewicz * format: 715e1ddb48SDavid Howells * 725e1ddb48SDavid Howells * | off | name | type | description | 735e1ddb48SDavid Howells * |-----+-----------------+------+--------------------------| 745e1ddb48SDavid Howells * | 0 | bLength | U8 | length of the descriptor | 755e1ddb48SDavid Howells * | 1 | bDescriptorType | U8 | descriptor type | 765e1ddb48SDavid Howells * | 2 | payload | | descriptor's payload | 775e1ddb48SDavid Howells */ 785e1ddb48SDavid Howells 795e1ddb48SDavid Howells struct usb_functionfs_strings_head { 805e1ddb48SDavid Howells __le32 magic; 815e1ddb48SDavid Howells __le32 length; 825e1ddb48SDavid Howells __le32 str_count; 835e1ddb48SDavid Howells __le32 lang_count; 845e1ddb48SDavid Howells } __attribute__((packed)); 855e1ddb48SDavid Howells 865e1ddb48SDavid Howells /* 875e1ddb48SDavid Howells * Strings format: 885e1ddb48SDavid Howells * 895e1ddb48SDavid Howells * | off | name | type | description | 905e1ddb48SDavid Howells * |-----+------------+-----------------------+----------------------------| 915e1ddb48SDavid Howells * | 0 | magic | LE32 | FUNCTIONFS_STRINGS_MAGIC | 925e1ddb48SDavid Howells * | 4 | length | LE32 | length of the data chunk | 935e1ddb48SDavid Howells * | 8 | str_count | LE32 | number of strings | 945e1ddb48SDavid Howells * | 12 | lang_count | LE32 | number of languages | 955e1ddb48SDavid Howells * | 16 | stringtab | StringTab[lang_count] | table of strings per lang | 965e1ddb48SDavid Howells * 975e1ddb48SDavid Howells * For each language there is one stringtab entry (ie. there are lang_count 985e1ddb48SDavid Howells * stringtab entires). Each StringTab has following format: 995e1ddb48SDavid Howells * 1005e1ddb48SDavid Howells * | off | name | type | description | 1015e1ddb48SDavid Howells * |-----+---------+-------------------+------------------------------------| 1025e1ddb48SDavid Howells * | 0 | lang | LE16 | language code | 1035e1ddb48SDavid Howells * | 2 | strings | String[str_count] | array of strings in given language | 1045e1ddb48SDavid Howells * 1055e1ddb48SDavid Howells * For each string there is one strings entry (ie. there are str_count 1065e1ddb48SDavid Howells * string entries). Each String is a NUL terminated string encoded in 1075e1ddb48SDavid Howells * UTF-8. 1085e1ddb48SDavid Howells */ 1095e1ddb48SDavid Howells 1105e1ddb48SDavid Howells #endif 1115e1ddb48SDavid Howells 1125e1ddb48SDavid Howells 1135e1ddb48SDavid Howells /* 1145e1ddb48SDavid Howells * Events are delivered on the ep0 file descriptor, when the user mode driver 1155e1ddb48SDavid Howells * reads from this file descriptor after writing the descriptors. Don't 1165e1ddb48SDavid Howells * stop polling this descriptor. 1175e1ddb48SDavid Howells */ 1185e1ddb48SDavid Howells 1195e1ddb48SDavid Howells enum usb_functionfs_event_type { 1205e1ddb48SDavid Howells FUNCTIONFS_BIND, 1215e1ddb48SDavid Howells FUNCTIONFS_UNBIND, 1225e1ddb48SDavid Howells 1235e1ddb48SDavid Howells FUNCTIONFS_ENABLE, 1245e1ddb48SDavid Howells FUNCTIONFS_DISABLE, 1255e1ddb48SDavid Howells 1265e1ddb48SDavid Howells FUNCTIONFS_SETUP, 1275e1ddb48SDavid Howells 1285e1ddb48SDavid Howells FUNCTIONFS_SUSPEND, 1295e1ddb48SDavid Howells FUNCTIONFS_RESUME 1305e1ddb48SDavid Howells }; 1315e1ddb48SDavid Howells 1325e1ddb48SDavid Howells /* NOTE: this structure must stay the same size and layout on 1335e1ddb48SDavid Howells * both 32-bit and 64-bit kernels. 1345e1ddb48SDavid Howells */ 1355e1ddb48SDavid Howells struct usb_functionfs_event { 1365e1ddb48SDavid Howells union { 1375e1ddb48SDavid Howells /* SETUP: packet; DATA phase i/o precedes next event 1385e1ddb48SDavid Howells *(setup.bmRequestType & USB_DIR_IN) flags direction */ 1395e1ddb48SDavid Howells struct usb_ctrlrequest setup; 1405e1ddb48SDavid Howells } __attribute__((packed)) u; 1415e1ddb48SDavid Howells 1425e1ddb48SDavid Howells /* enum usb_functionfs_event_type */ 1435e1ddb48SDavid Howells __u8 type; 1445e1ddb48SDavid Howells __u8 _pad[3]; 1455e1ddb48SDavid Howells } __attribute__((packed)); 1465e1ddb48SDavid Howells 1475e1ddb48SDavid Howells 1485e1ddb48SDavid Howells /* Endpoint ioctls */ 1495e1ddb48SDavid Howells /* The same as in gadgetfs */ 1505e1ddb48SDavid Howells 1515e1ddb48SDavid Howells /* IN transfers may be reported to the gadget driver as complete 1525e1ddb48SDavid Howells * when the fifo is loaded, before the host reads the data; 1535e1ddb48SDavid Howells * OUT transfers may be reported to the host's "client" driver as 1545e1ddb48SDavid Howells * complete when they're sitting in the FIFO unread. 1555e1ddb48SDavid Howells * THIS returns how many bytes are "unclaimed" in the endpoint fifo 1565e1ddb48SDavid Howells * (needed for precise fault handling, when the hardware allows it) 1575e1ddb48SDavid Howells */ 1585e1ddb48SDavid Howells #define FUNCTIONFS_FIFO_STATUS _IO('g', 1) 1595e1ddb48SDavid Howells 1605e1ddb48SDavid Howells /* discards any unclaimed data in the fifo. */ 1615e1ddb48SDavid Howells #define FUNCTIONFS_FIFO_FLUSH _IO('g', 2) 1625e1ddb48SDavid Howells 1635e1ddb48SDavid Howells /* resets endpoint halt+toggle; used to implement set_interface. 1645e1ddb48SDavid Howells * some hardware (like pxa2xx) can't support this. 1655e1ddb48SDavid Howells */ 1665e1ddb48SDavid Howells #define FUNCTIONFS_CLEAR_HALT _IO('g', 3) 1675e1ddb48SDavid Howells 1685e1ddb48SDavid Howells /* Specific for functionfs */ 1695e1ddb48SDavid Howells 1705e1ddb48SDavid Howells /* 1715e1ddb48SDavid Howells * Returns reverse mapping of an interface. Called on EP0. If there 1725e1ddb48SDavid Howells * is no such interface returns -EDOM. If function is not active 1735e1ddb48SDavid Howells * returns -ENODEV. 1745e1ddb48SDavid Howells */ 1755e1ddb48SDavid Howells #define FUNCTIONFS_INTERFACE_REVMAP _IO('g', 128) 1765e1ddb48SDavid Howells 1775e1ddb48SDavid Howells /* 1785e1ddb48SDavid Howells * Returns real bEndpointAddress of an endpoint. If function is not 1795e1ddb48SDavid Howells * active returns -ENODEV. 1805e1ddb48SDavid Howells */ 1815e1ddb48SDavid Howells #define FUNCTIONFS_ENDPOINT_REVMAP _IO('g', 129) 1825e1ddb48SDavid Howells 1835e1ddb48SDavid Howells 1845e1ddb48SDavid Howells 1855e1ddb48SDavid Howells #endif /* _UAPI__LINUX_FUNCTIONFS_H__ */ 186