| #ifndef __LINUX_FUNCTIONFS_H__ | 
 | #define __LINUX_FUNCTIONFS_H__ 1 | 
 |  | 
 |  | 
 | #include <linux/types.h> | 
 | #include <linux/ioctl.h> | 
 |  | 
 | #include <linux/usb/ch9.h> | 
 |  | 
 |  | 
 | enum { | 
 | 	FUNCTIONFS_DESCRIPTORS_MAGIC = 1, | 
 | 	FUNCTIONFS_STRINGS_MAGIC     = 2 | 
 | }; | 
 |  | 
 |  | 
 | #ifndef __KERNEL__ | 
 |  | 
 | /* Descriptor of an non-audio endpoint */ | 
 | struct usb_endpoint_descriptor_no_audio { | 
 | 	__u8  bLength; | 
 | 	__u8  bDescriptorType; | 
 |  | 
 | 	__u8  bEndpointAddress; | 
 | 	__u8  bmAttributes; | 
 | 	__le16 wMaxPacketSize; | 
 | 	__u8  bInterval; | 
 | } __attribute__((packed)); | 
 |  | 
 |  | 
 | /* | 
 |  * All numbers must be in little endian order. | 
 |  */ | 
 |  | 
 | struct usb_functionfs_descs_head { | 
 | 	__le32 magic; | 
 | 	__le32 length; | 
 | 	__le32 fs_count; | 
 | 	__le32 hs_count; | 
 | } __attribute__((packed)); | 
 |  | 
 | /* | 
 |  * Descriptors format: | 
 |  * | 
 |  * | off | name      | type         | description                          | | 
 |  * |-----+-----------+--------------+--------------------------------------| | 
 |  * |   0 | magic     | LE32         | FUNCTIONFS_{FS,HS}_DESCRIPTORS_MAGIC | | 
 |  * |   4 | length    | LE32         | length of the whole data chunk       | | 
 |  * |   8 | fs_count  | LE32         | number of full-speed descriptors     | | 
 |  * |  12 | hs_count  | LE32         | number of high-speed descriptors     | | 
 |  * |  16 | fs_descrs | Descriptor[] | list of full-speed descriptors       | | 
 |  * |     | hs_descrs | Descriptor[] | list of high-speed descriptors       | | 
 |  * | 
 |  * descs are just valid USB descriptors and have the following format: | 
 |  * | 
 |  * | off | name            | type | description              | | 
 |  * |-----+-----------------+------+--------------------------| | 
 |  * |   0 | bLength         | U8   | length of the descriptor | | 
 |  * |   1 | bDescriptorType | U8   | descriptor type          | | 
 |  * |   2 | payload         |      | descriptor's payload     | | 
 |  */ | 
 |  | 
 | struct usb_functionfs_strings_head { | 
 | 	__le32 magic; | 
 | 	__le32 length; | 
 | 	__le32 str_count; | 
 | 	__le32 lang_count; | 
 | } __attribute__((packed)); | 
 |  | 
 | /* | 
 |  * Strings format: | 
 |  * | 
 |  * | off | name       | type                  | description                | | 
 |  * |-----+------------+-----------------------+----------------------------| | 
 |  * |   0 | magic      | LE32                  | FUNCTIONFS_STRINGS_MAGIC   | | 
 |  * |   4 | length     | LE32                  | length of the data chunk   | | 
 |  * |   8 | str_count  | LE32                  | number of strings          | | 
 |  * |  12 | lang_count | LE32                  | number of languages        | | 
 |  * |  16 | stringtab  | StringTab[lang_count] | table of strings per lang  | | 
 |  * | 
 |  * For each language there is one stringtab entry (ie. there are lang_count | 
 |  * stringtab entires).  Each StringTab has following format: | 
 |  * | 
 |  * | off | name    | type              | description                        | | 
 |  * |-----+---------+-------------------+------------------------------------| | 
 |  * |   0 | lang    | LE16              | language code                      | | 
 |  * |   2 | strings | String[str_count] | array of strings in given language | | 
 |  * | 
 |  * For each string there is one strings entry (ie. there are str_count | 
 |  * string entries).  Each String is a NUL terminated string encoded in | 
 |  * UTF-8. | 
 |  */ | 
 |  | 
 | #endif | 
 |  | 
 |  | 
 | /* | 
 |  * Events are delivered on the ep0 file descriptor, when the user mode driver | 
 |  * reads from this file descriptor after writing the descriptors.  Don't | 
 |  * stop polling this descriptor. | 
 |  */ | 
 |  | 
 | enum usb_functionfs_event_type { | 
 | 	FUNCTIONFS_BIND, | 
 | 	FUNCTIONFS_UNBIND, | 
 |  | 
 | 	FUNCTIONFS_ENABLE, | 
 | 	FUNCTIONFS_DISABLE, | 
 |  | 
 | 	FUNCTIONFS_SETUP, | 
 |  | 
 | 	FUNCTIONFS_SUSPEND, | 
 | 	FUNCTIONFS_RESUME | 
 | }; | 
 |  | 
 | /* NOTE:  this structure must stay the same size and layout on | 
 |  * both 32-bit and 64-bit kernels. | 
 |  */ | 
 | struct usb_functionfs_event { | 
 | 	union { | 
 | 		/* SETUP: packet; DATA phase i/o precedes next event | 
 | 		 *(setup.bmRequestType & USB_DIR_IN) flags direction */ | 
 | 		struct usb_ctrlrequest	setup; | 
 | 	} __attribute__((packed)) u; | 
 |  | 
 | 	/* enum usb_functionfs_event_type */ | 
 | 	__u8				type; | 
 | 	__u8				_pad[3]; | 
 | } __attribute__((packed)); | 
 |  | 
 |  | 
 | /* Endpoint ioctls */ | 
 | /* The same as in gadgetfs */ | 
 |  | 
 | /* IN transfers may be reported to the gadget driver as complete | 
 |  *	when the fifo is loaded, before the host reads the data; | 
 |  * OUT transfers may be reported to the host's "client" driver as | 
 |  *	complete when they're sitting in the FIFO unread. | 
 |  * THIS returns how many bytes are "unclaimed" in the endpoint fifo | 
 |  * (needed for precise fault handling, when the hardware allows it) | 
 |  */ | 
 | #define	FUNCTIONFS_FIFO_STATUS	_IO('g', 1) | 
 |  | 
 | /* discards any unclaimed data in the fifo. */ | 
 | #define	FUNCTIONFS_FIFO_FLUSH	_IO('g', 2) | 
 |  | 
 | /* resets endpoint halt+toggle; used to implement set_interface. | 
 |  * some hardware (like pxa2xx) can't support this. | 
 |  */ | 
 | #define	FUNCTIONFS_CLEAR_HALT	_IO('g', 3) | 
 |  | 
 | /* Specific for functionfs */ | 
 |  | 
 | /* | 
 |  * Returns reverse mapping of an interface.  Called on EP0.  If there | 
 |  * is no such interface returns -EDOM.  If function is not active | 
 |  * returns -ENODEV. | 
 |  */ | 
 | #define	FUNCTIONFS_INTERFACE_REVMAP	_IO('g', 128) | 
 |  | 
 | /* | 
 |  * Returns real bEndpointAddress of an endpoint.  If function is not | 
 |  * active returns -ENODEV. | 
 |  */ | 
 | #define	FUNCTIONFS_ENDPOINT_REVMAP	_IO('g', 129) | 
 |  | 
 |  | 
 | #ifdef __KERNEL__ | 
 |  | 
 | struct ffs_data; | 
 | struct usb_composite_dev; | 
 | struct usb_configuration; | 
 |  | 
 |  | 
 | static int  functionfs_init(void) __attribute__((warn_unused_result)); | 
 | static void functionfs_cleanup(void); | 
 |  | 
 | static int functionfs_bind(struct ffs_data *ffs, struct usb_composite_dev *cdev) | 
 | 	__attribute__((warn_unused_result, nonnull)); | 
 | static void functionfs_unbind(struct ffs_data *ffs) | 
 | 	__attribute__((nonnull)); | 
 |  | 
 | static int functionfs_bind_config(struct usb_composite_dev *cdev, | 
 | 				  struct usb_configuration *c, | 
 | 				  struct ffs_data *ffs) | 
 | 	__attribute__((warn_unused_result, nonnull)); | 
 |  | 
 |  | 
 | static int functionfs_ready_callback(struct ffs_data *ffs) | 
 | 	__attribute__((warn_unused_result, nonnull)); | 
 | static void functionfs_closed_callback(struct ffs_data *ffs) | 
 | 	__attribute__((nonnull)); | 
 | static int functionfs_check_dev_callback(const char *dev_name) | 
 | 	__attribute__((warn_unused_result, nonnull)); | 
 |  | 
 |  | 
 | #endif | 
 |  | 
 | #endif |