forked from mirrors/linux
		
	 1da177e4c3
			
		
	
	
		1da177e4c3
		
	
	
	
	
		
			
			Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
		
			
				
	
	
		
			75 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #include <asm/types.h>
 | |
| #include <asm/ioctl.h>
 | |
| 
 | |
| #include <linux/usb_ch9.h>
 | |
| 
 | |
| /*
 | |
|  * Filesystem based user-mode API to USB Gadget controller hardware
 | |
|  *
 | |
|  * Almost everything can be done with only read and write operations,
 | |
|  * on endpoint files found in one directory.  They are configured by
 | |
|  * writing descriptors, and then may be used for normal stream style
 | |
|  * i/o requests.  When ep0 is configured, the device can enumerate;
 | |
|  * when it's closed, the device disconnects from usb.
 | |
|  *
 | |
|  * Configuration and device descriptors get written to /dev/gadget/$CHIP,
 | |
|  * which may then be used to read usb_gadgetfs_event structs.  The driver
 | |
|  * may activate endpoints as it handles SET_CONFIGURATION setup events,
 | |
|  * or earlier; writing endpoint descriptors to /dev/gadget/$ENDPOINT
 | |
|  * then performing data transfers by reading or writing.
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * Events are delivered on the ep0 file descriptor, if the user mode driver
 | |
|  * reads from this file descriptor after writing the descriptors.  Don't
 | |
|  * stop polling this descriptor, if you write that kind of driver.
 | |
|  */
 | |
| 
 | |
| enum usb_gadgetfs_event_type {
 | |
| 	GADGETFS_NOP = 0,
 | |
| 
 | |
| 	GADGETFS_CONNECT,
 | |
| 	GADGETFS_DISCONNECT,
 | |
| 	GADGETFS_SETUP,
 | |
| 	GADGETFS_SUSPEND,
 | |
| 	// and likely more !
 | |
| };
 | |
| 
 | |
| struct usb_gadgetfs_event {
 | |
| 	enum usb_gadgetfs_event_type	type;
 | |
| 	union {
 | |
| 		// NOP, DISCONNECT, SUSPEND: nothing
 | |
| 		// ... some hardware can't report disconnection
 | |
| 
 | |
| 		// CONNECT: just the speed
 | |
| 		enum usb_device_speed	speed;
 | |
| 
 | |
| 		// SETUP: packet; DATA phase i/o precedes next event
 | |
| 		// (setup.bmRequestType & USB_DIR_IN) flags direction 
 | |
| 		// ... includes SET_CONFIGURATION, SET_INTERFACE
 | |
| 		struct usb_ctrlrequest	setup;
 | |
| 	} u;
 | |
| };
 | |
| 
 | |
| 
 | |
| /* endpoint ioctls */
 | |
| 
 | |
| /* 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	GADGETFS_FIFO_STATUS	_IO('g',1)
 | |
| 
 | |
| /* discards any unclaimed data in the fifo. */
 | |
| #define	GADGETFS_FIFO_FLUSH	_IO('g',2)
 | |
| 
 | |
| /* resets endpoint halt+toggle; used to implement set_interface.
 | |
|  * some hardware (like pxa2xx) can't support this.
 | |
|  */
 | |
| #define	GADGETFS_CLEAR_HALT	_IO('g',3)
 | |
| 
 | |
| 
 |