| Michal Nazarewicz | ddf8abd | 2010-05-05 12:53:14 +0200 | [diff] [blame] | 1 | #ifndef __LINUX_FUNCTIONFS_H__ | 
 | 2 | #define __LINUX_FUNCTIONFS_H__ 1 | 
 | 3 |  | 
 | 4 |  | 
 | 5 | #include <linux/types.h> | 
 | 6 | #include <linux/ioctl.h> | 
 | 7 |  | 
 | 8 | #include <linux/usb/ch9.h> | 
 | 9 |  | 
 | 10 |  | 
 | 11 | enum { | 
 | 12 | 	FUNCTIONFS_DESCRIPTORS_MAGIC = 1, | 
 | 13 | 	FUNCTIONFS_STRINGS_MAGIC     = 2 | 
 | 14 | }; | 
 | 15 |  | 
 | 16 |  | 
 | 17 | #ifndef __KERNEL__ | 
 | 18 |  | 
 | 19 | /* Descriptor of an non-audio endpoint */ | 
 | 20 | struct 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 |  | 
 | 35 | struct 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 | | 
| Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 48 |  * |   4 | length    | LE32         | length of the whole data chunk       | | 
| Michal Nazarewicz | ddf8abd | 2010-05-05 12:53:14 +0200 | [diff] [blame] | 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 |  | 
 | 63 | struct 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 |  * | 
| Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 89 |  * For each string there is one strings entry (ie. there are str_count | 
| Michal Nazarewicz | ddf8abd | 2010-05-05 12:53:14 +0200 | [diff] [blame] | 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 |  | 
 | 103 | enum 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 |  */ | 
 | 119 | struct 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 | #ifdef __KERNEL__ | 
 | 169 |  | 
 | 170 | struct ffs_data; | 
 | 171 | struct usb_composite_dev; | 
 | 172 | struct usb_configuration; | 
 | 173 |  | 
 | 174 |  | 
 | 175 | static int  functionfs_init(void) __attribute__((warn_unused_result)); | 
 | 176 | static void functionfs_cleanup(void); | 
 | 177 |  | 
 | 178 | static int functionfs_bind(struct ffs_data *ffs, struct usb_composite_dev *cdev) | 
 | 179 | 	__attribute__((warn_unused_result, nonnull)); | 
 | 180 | static void functionfs_unbind(struct ffs_data *ffs) | 
 | 181 | 	__attribute__((nonnull)); | 
 | 182 |  | 
| Michal Nazarewicz | 7898aee | 2010-06-16 12:07:58 +0200 | [diff] [blame] | 183 | static int functionfs_bind_config(struct usb_composite_dev *cdev, | 
 | 184 | 				  struct usb_configuration *c, | 
 | 185 | 				  struct ffs_data *ffs) | 
| Michal Nazarewicz | ddf8abd | 2010-05-05 12:53:14 +0200 | [diff] [blame] | 186 | 	__attribute__((warn_unused_result, nonnull)); | 
 | 187 |  | 
 | 188 |  | 
 | 189 | static int functionfs_ready_callback(struct ffs_data *ffs) | 
 | 190 | 	__attribute__((warn_unused_result, nonnull)); | 
 | 191 | static void functionfs_closed_callback(struct ffs_data *ffs) | 
 | 192 | 	__attribute__((nonnull)); | 
 | 193 | static int functionfs_check_dev_callback(const char *dev_name) | 
 | 194 | 	__attribute__((warn_unused_result, nonnull)); | 
 | 195 |  | 
 | 196 |  | 
 | 197 | #endif | 
 | 198 |  | 
 | 199 | #endif |