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 + -
显示快捷键?