usb.h

来自「Linux Kernel 2.6.9 for OMAP1710」· C头文件 代码 · 共 1,114 行 · 第 1/4 页

H
1,114
字号
				      struct usb_device *dev,				      unsigned int pipe,				      void *transfer_buffer,				      int buffer_length,				      usb_complete_t complete,				      void *context){	spin_lock_init(&urb->lock);	urb->dev = dev;	urb->pipe = pipe;	urb->transfer_buffer = transfer_buffer;	urb->transfer_buffer_length = buffer_length;	urb->complete = complete;	urb->context = context;}/** * usb_fill_int_urb - macro to help initialize a interrupt urb * @urb: pointer to the urb to initialize. * @dev: pointer to the struct usb_device for this urb. * @pipe: the endpoint pipe * @transfer_buffer: pointer to the transfer buffer * @buffer_length: length of the transfer buffer * @complete: pointer to the usb_complete_t function * @context: what to set the urb context to. * @interval: what to set the urb interval to, encoded like *	the endpoint descriptor's bInterval value. * * Initializes a interrupt urb with the proper information needed to submit * it to a device. * Note that high speed interrupt endpoints use a logarithmic encoding of * the endpoint interval, and express polling intervals in microframes * (eight per millisecond) rather than in frames (one per millisecond). */static inline void usb_fill_int_urb (struct urb *urb,				     struct usb_device *dev,				     unsigned int pipe,				     void *transfer_buffer,				     int buffer_length,				     usb_complete_t complete,				     void *context,				     int interval){	spin_lock_init(&urb->lock);	urb->dev = dev;	urb->pipe = pipe;	urb->transfer_buffer = transfer_buffer;	urb->transfer_buffer_length = buffer_length;	urb->complete = complete;	urb->context = context;	if (dev->speed == USB_SPEED_HIGH)		urb->interval = 1 << (interval - 1);	else		urb->interval = interval;	urb->start_frame = -1;}extern void usb_init_urb(struct urb *urb);extern struct urb *usb_alloc_urb(int iso_packets, int mem_flags);extern void usb_free_urb(struct urb *urb);#define usb_put_urb usb_free_urbextern struct urb *usb_get_urb(struct urb *urb);extern int usb_submit_urb(struct urb *urb, int mem_flags);extern int usb_unlink_urb(struct urb *urb);extern void usb_kill_urb(struct urb *urb);#define HAVE_USB_BUFFERSvoid *usb_buffer_alloc (struct usb_device *dev, size_t size,	int mem_flags, dma_addr_t *dma);void usb_buffer_free (struct usb_device *dev, size_t size,	void *addr, dma_addr_t dma);struct urb *usb_buffer_map (struct urb *urb);#if 0void usb_buffer_dmasync (struct urb *urb);#endifvoid usb_buffer_unmap (struct urb *urb);struct scatterlist;int usb_buffer_map_sg (struct usb_device *dev, unsigned pipe,		struct scatterlist *sg, int nents);#if 0void usb_buffer_dmasync_sg (struct usb_device *dev, unsigned pipe,		struct scatterlist *sg, int n_hw_ents);#endifvoid usb_buffer_unmap_sg (struct usb_device *dev, unsigned pipe,		struct scatterlist *sg, int n_hw_ents);/*-------------------------------------------------------------------* *                         SYNCHRONOUS CALL SUPPORT                  * *-------------------------------------------------------------------*/extern int usb_control_msg(struct usb_device *dev, unsigned int pipe,	__u8 request, __u8 requesttype, __u16 value, __u16 index,	void *data, __u16 size, int timeout);extern int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe,	void *data, int len, int *actual_length,	int timeout);/* selective suspend/resume */extern int usb_suspend_device(struct usb_device *dev, u32 state);extern int usb_resume_device(struct usb_device *dev);/* wrappers around usb_control_msg() for the most common standard requests */extern int usb_get_descriptor(struct usb_device *dev, unsigned char desctype,	unsigned char descindex, void *buf, int size);extern int usb_get_status(struct usb_device *dev,	int type, int target, void *data);extern int usb_get_string(struct usb_device *dev,	unsigned short langid, unsigned char index, void *buf, int size);extern int usb_string(struct usb_device *dev, int index,	char *buf, size_t size);/* wrappers that also update important state inside usbcore */extern int usb_clear_halt(struct usb_device *dev, int pipe);extern int usb_reset_configuration(struct usb_device *dev);extern int usb_set_interface(struct usb_device *dev, int ifnum, int alternate);/* * timeouts, in seconds, used for sending/receiving control messages * they typically complete within a few frames (msec) after they're issued * USB identifies 5 second timeouts, maybe more in a few cases, and a few * slow devices (like some MGE Ellipse UPSes) actually push that limit. */#define USB_CTRL_GET_TIMEOUT	5#define USB_CTRL_SET_TIMEOUT	5/** * struct usb_sg_request - support for scatter/gather I/O * @status: zero indicates success, else negative errno * @bytes: counts bytes transferred. * * These requests are initialized using usb_sg_init(), and then are used * as request handles passed to usb_sg_wait() or usb_sg_cancel().  Most * members of the request object aren't for driver access. * * The status and bytecount values are valid only after usb_sg_wait() * returns.  If the status is zero, then the bytecount matches the total * from the request. * * After an error completion, drivers may need to clear a halt condition * on the endpoint. */struct usb_sg_request {	int			status;	size_t			bytes;	/* 	 * members below are private to usbcore,	 * and are not provided for driver access!	 */	spinlock_t		lock;	struct usb_device	*dev;	int			pipe;	struct scatterlist	*sg;	int			nents;	int			entries;	struct urb		**urbs;	int			count;	struct completion	complete;};int usb_sg_init (	struct usb_sg_request	*io,	struct usb_device	*dev,	unsigned		pipe, 	unsigned		period,	struct scatterlist	*sg,	int			nents,	size_t			length,	int			mem_flags);void usb_sg_cancel (struct usb_sg_request *io);void usb_sg_wait (struct usb_sg_request *io);/* -------------------------------------------------------------------------- *//* * Calling this entity a "pipe" is glorifying it. A USB pipe * is something embarrassingly simple: it basically consists * of the following information: *  - device number (7 bits) *  - endpoint number (4 bits) *  - current Data0/1 state (1 bit) [Historical; now gone] *  - direction (1 bit) *  - speed (1 bit) [Historical and specific to USB 1.1; now gone.] *  - max packet size (2 bits: 8, 16, 32 or 64) [Historical; now gone.] *  - pipe type (2 bits: control, interrupt, bulk, isochronous) * * That's 18 bits. Really. Nothing more. And the USB people have * documented these eighteen bits as some kind of glorious * virtual data structure. * * Let's not fall in that trap. We'll just encode it as a simple * unsigned int. The encoding is: * *  - max size:		bits 0-1	[Historical; now gone.] *  - direction:	bit 7		(0 = Host-to-Device [Out], *					 1 = Device-to-Host [In] ... *					like endpoint bEndpointAddress) *  - device:		bits 8-14       ... bit positions known to uhci-hcd *  - endpoint:		bits 15-18      ... bit positions known to uhci-hcd *  - Data0/1:		bit 19		[Historical; now gone. ] *  - lowspeed:		bit 26		[Historical; now gone. ] *  - pipe type:	bits 30-31	(00 = isochronous, 01 = interrupt, *					 10 = control, 11 = bulk) * * Why? Because it's arbitrary, and whatever encoding we select is really * up to us. This one happens to share a lot of bit positions with the UHCI * specification, so that much of the uhci driver can just mask the bits * appropriately. *//* NOTE:  these are not the standard USB_ENDPOINT_XFER_* values!! */#define PIPE_ISOCHRONOUS		0#define PIPE_INTERRUPT			1#define PIPE_CONTROL			2#define PIPE_BULK			3#define usb_maxpacket(dev, pipe, out)	(out \				? (dev)->epmaxpacketout[usb_pipeendpoint(pipe)] \				: (dev)->epmaxpacketin [usb_pipeendpoint(pipe)] )#define usb_pipein(pipe)	((pipe) & USB_DIR_IN)#define usb_pipeout(pipe)	(!usb_pipein(pipe))#define usb_pipedevice(pipe)	(((pipe) >> 8) & 0x7f)#define usb_pipeendpoint(pipe)	(((pipe) >> 15) & 0xf)#define usb_pipetype(pipe)	(((pipe) >> 30) & 3)#define usb_pipeisoc(pipe)	(usb_pipetype((pipe)) == PIPE_ISOCHRONOUS)#define usb_pipeint(pipe)	(usb_pipetype((pipe)) == PIPE_INTERRUPT)#define usb_pipecontrol(pipe)	(usb_pipetype((pipe)) == PIPE_CONTROL)#define usb_pipebulk(pipe)	(usb_pipetype((pipe)) == PIPE_BULK)/* The D0/D1 toggle bits ... USE WITH CAUTION (they're almost hcd-internal) */#define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> (ep)) & 1)#define	usb_dotoggle(dev, ep, out)  ((dev)->toggle[out] ^= (1 << (ep)))#define usb_settoggle(dev, ep, out, bit) ((dev)->toggle[out] = ((dev)->toggle[out] & ~(1 << (ep))) | ((bit) << (ep)))static inline unsigned int __create_pipe(struct usb_device *dev, unsigned int endpoint){	return (dev->devnum << 8) | (endpoint << 15);}/* Create various pipes... */#define usb_sndctrlpipe(dev,endpoint)	((PIPE_CONTROL << 30) | __create_pipe(dev,endpoint))#define usb_rcvctrlpipe(dev,endpoint)	((PIPE_CONTROL << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)#define usb_sndisocpipe(dev,endpoint)	((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev,endpoint))#define usb_rcvisocpipe(dev,endpoint)	((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)#define usb_sndbulkpipe(dev,endpoint)	((PIPE_BULK << 30) | __create_pipe(dev,endpoint))#define usb_rcvbulkpipe(dev,endpoint)	((PIPE_BULK << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)#define usb_sndintpipe(dev,endpoint)	((PIPE_INTERRUPT << 30) | __create_pipe(dev,endpoint))#define usb_rcvintpipe(dev,endpoint)	((PIPE_INTERRUPT << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN)/* -------------------------------------------------------------------------- */#ifdef DEBUG#define dbg(format, arg...) printk(KERN_DEBUG "%s: " format "\n" , __FILE__ , ## arg)#else#define dbg(format, arg...) do {} while (0)#endif#define err(format, arg...) printk(KERN_ERR "%s: " format "\n" , __FILE__ , ## arg)#define info(format, arg...) printk(KERN_INFO "%s: " format "\n" , __FILE__ , ## arg)#define warn(format, arg...) printk(KERN_WARNING "%s: " format "\n" , __FILE__ , ## arg)#endif  /* __KERNEL__ */#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?