- 注册时间
- 2011-10-23
- 最后登录
- 2011-10-31
- 阅读权限
- 30
- 积分
- 400
- 精华
- 0
- 帖子
- 126
 
升级   66.67%
|
相关的主题文章:
怎么可能这样的呀
美国身为世界第一大黄金贮备国
小猫钓鱼做法
不晓得你曾经流过多少泪
更沁人肺腑值得咱们去咀嚼
在内核中的USB代码跟USB设备进行通信,应用的是Urb(USB request block)。Urb能够看成是一个USB的驱动和USB 的endpoint通讯的桥梁。有两种方法
Control EndPoint
usb_complete_t complete; /* (in) completion routine */
int interval; /* (modify) transfer interval (INT/ISO) */
int actual_length; /* (return) actual transfer length */
struct urb
...*/
当Urb被创建并且初始化完成之后就可以通过usb_submit_urb提交给Usb core 了
struct urb *usb_alloc_urb(int iso_packets, int mem_flags);
void *transfer_buffer; /* (in) associated data buffer */
struct usb_device *dev; /* (in) pointer to associated device */
Isochronous EndPoint
int bandwidth; /* bandwidth for INT/ISO request */
usb_unlink_urb这个函数在返回到调用者之前不等候这个 urb 完整停滞。由于要完全结束一个Urb,必需要USB core可能睡眠当前过程。当然,Urb的transfer_flags须要一个URB_ASYNC_UNLINK。
;
int error_count; /* (return) number of ISO errors */
Interrupt EndPoint
/* public, documented fields in the urb that can be used by drivers */
void usb_fill_bulk_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe, void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context);
struct list_head urb_list; /* list pointer to all active urbs */
int status; /* (return) non-ISO status */
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);
struct usb_iso_packet_descriptor iso_frame_desc[0]; /* (in) ISO ONLY */
2、 分配一个Endpoint,因为Endpoint有四品种型,所以在调配的时候也有4个方式:
dma_addr_t setup_dma; /* (in) dma addr for setup_packet */
一个Urb的性命周期
void *hcpriv; /* private data for host controller */
Urb的定义如下
int start_frame; /* (modify) start frame (ISO) */
u8 reject; /* submissions will fail */
4、 当Urb实现数据传输义务后,开释该Urb
spinlock_t lock; /* lock for the URB */
3、 通过USB装备驱动程序,提交给USB core
unsigned int pipe; /* (in) pipe information */
void *context; /* (in) context for completion */
通过int usb_kill_urb(struct urb *urb); 或者int usb_unlink_urb(struct urb *urb);来释放Urb。usb_kill_urb经常在设备从体系中移除的时候使用,终止该Urb的生命周期
|
|