日期:2014-05-16 浏览次数:20763 次
f_sourcesink.c里面在执行set_alt方法后就调用source_sink_start_ep(),这里面就有usb_ep_queue()可以认为开始进行数据交互。后期我要改一下这个过程,通过一个简单的misc驱动去分开调用接受发送
我们现在看
static int source_sink_start_ep(struct f_sourcesink *ss,boolis_in)
{
structusb_ep *ep;
structusb_request *req;
int status;
ep = is_in ? ss->in_ep :ss->out_ep;
//是in还是out,
req = alloc_ep_req(ep);
if(!req)
return-ENOMEM;
req->complete =source_sink_complete;//下面来说
if(is_in)// 这里要说的就是in是对于主机来说
reinit_write_data(ep, req);//把数据写到req的buf中
else
memset(req->buf, 0x55,req->length);//初始化req->buf
status = usb_ep_queue(ep, req,GFP_ATOMIC);//提交req到硬件fifo
if(status) {
structusb_composite_dev *cdev;
cdev =ss->function.config->cdev;
free_ep_req(ep, req);
}
/*
这里总结一下数据交互过程
1. 动态申请空间。
2. 设置完成函数。
3. 是in就或取数据(操作硬件的话,可能用到别的驱动),是out就初始化req->buf。
4. 提交req到硬件fifo。
万变不离其宗,大概就这样。
*/
returnstatus;
}
看完成函数
static void source_sink_complete(struct usb_ep *ep,structusb_request *req)
{
structf_sourcesink *ss = ep->driver_data;
structusb_composite_dev *cdev = ss->function.config->cdev;
int &n