07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

830 void *transfer_buffer,<br />

831 int buffer_length,<br />

832 usb_complete_t complete,<br />

833 void *context)<br />

834 {<br />

835 spin_lock_init(&urb->lock);<br />

836 urb->dev = dev;<br />

837 urb->pipe = pipe;<br />

838 urb->setup_packet = setup_packet;<br />

839 urb->transfer_buffer = transfer_buffer;<br />

840 urb->transfer_buffer_length = buffer_length;<br />

841 urb->complete = complete;<br />

842 urb->context = context;<br />

843 }<br />

79<br />

很显然,她就是为特定的pipe 填充一个urb(最初urb 申请的时候被初始化为0 了嘛不是).对比函数调用<br />

和函数定义,可知, 这个pipe 被设为了us->recv_ctrl_pipe,即接收控制管道,也就是说专门为设备向主机<br />

发送数据而设置的管道.而这个urb 就是us->current_urb,并且除了urb->setup_packet(unsigned<br />

char 类型的指针)指向了us->cr 之外,urb->transfer_buffer(void 指针)指向了<br />

us->iobuf,urb->transfer_buffer_length(int 类型)被赋值为1,urb->complete(usb_complete_t<br />

类型)被赋值为usb_stor_blocking_completion.<br />

此处特意提一下usb_complete_t 类型,在include/linux/usb.h 中,有这么一行,<br />

612 typedef void (*usb_complete_t)(struct urb *, struct pt_regs *);<br />

这里用了typedef 来简化声明,不熟悉typedef 功能的可以去查一下,typedef 的强大使得以下两种声明<br />

作用相同:<br />

一种是:<br />

void (*func1)(struct urb *,struct pt_regs *);<br />

void (*func2)(struct urb *,struct pt_regs *);<br />

void (*func3)(struct urb *,struct pt_regs *);<br />

另一种是:<br />

typedef void (*usb_complete_t)(struct urb *, struct pt_regs *);<br />

usb_complete_t func1;<br />

usb_complete_t func2;<br />

usb_complete_t func3;<br />

看出来了吧,如果要声明很多个函数指针,她们的参数又都很复杂,那么显然使用typedef 一次,就可以一<br />

劳永逸了,以后声明就很简单了.所以,咱们也就知道实际上,urb 中的complete 是一个函数指针,她被设置<br />

为指向函数usb_stor_blocking_completion().关于usb_stor_blocking_completion()咱们暂且不提,<br />

等到用的时候再说.<br />

看完了usb_fill_control_urb,咱们再回到usb_stor_control_msg()函数,接下来是下一个函<br />

数,usb_stor_msg_common(),注意了,usb_fill_control_urb 这个函数只填充了urb 中的几个元<br />

素,struct urb 里面包含了很多东西,不过有一些设置是共同的,所以下面用usb_stor_msg_common()<br />

函数来设置,可以看出给这个函数传递的参数只有两个,一个就是us,另一个是timeout(传给她的值是HZ),<br />

我们继续进入到这个函数中来把她看个清清楚楚明明白白真真切切.天空收容每一片云彩,不论其美丑,所以<br />

天空宽阔无边;大地拥抱每一寸土地,不论其贫富,所以大地广袤无垠;海洋接纳每一条河流,不论其大小,所

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!