首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

Linux USB Gadget-装置枚举

2012-08-03 
Linux USB Gadget--设备枚举前面介绍了Linux USB Gadget的软件结构与各软件层的整合过程。经过各种注册函数

Linux USB Gadget--设备枚举
        前面介绍了Linux USB Gadget的软件结构与各软件层的整合过程。经过各种注册函数,Gadget功能驱动层,USB设备层与UDC底层结合在了一起形成了一个完整的USB设备。而这个设备已经准备好了接受主机的枚举。在介绍USB设备枚举之前。先熟悉一下各层通信所用的数据结构,在USB主机端编写USB设备驱动程序,最重要的结构就是URB了,我们只需要将各种URB提交给USB核心,核心就会自动给我们的数据发送到指定的设备。而对于设备端也有这样一个类似的重要的数据结构。这个数据结构就是urt--usb_request。每一个端点都有一个urt链表,上面挂着各种urt。在底层的UDC的中断处理程序中,针对不同的端点调用不同的处理函数,总之是处理端点上的urt链表,处理完一个urt就调用预先设置好的回调函数。这就是设备端数据处理的流程。下面分析一下usb_request结构:

if (value >= 0) {req->length = value;req->zero = value < w_length;value = usb_ep_queue(gadget->ep0, req, GFP_ATOMIC);if (value < 0) {DBG(cdev, "ep_queue --> %d\n", value);req->status = 0;composite_setup_complete(gadget->ep0, req);}}
        现在执行到了if (value < 0) { 这里对于上面的分析value是0所以下面的代码不执行。composite_setup函数也就返回了。返回到了 s3c2410_udc_handle_ep0_idle。因为没有出错, s3c2410_udc_handle_ep0_idle函数也返回了。返回到了s3c2410_udc_handle_ep0中,这时dev->ep0state还是EP0_IDLE状态。所以s3c2410_udc_handle_ep0也返回了。最后中断返回完成了这个控制传输。至于控制传输的状态阶段是由硬件来完成的。当我们向FIFO中写入了全部的数据,就可以设置EP0_CSR寄存器的DATA_END为1,硬件将自动完成状态阶段。还有一点,控制传输的urt回调函数非常简单,只打印一些调试信息,当最后一次调用s3c2410_udc_read_fifo时,s3c2410_udc_read_fifo会在函数里面调用urt的回调函数。
        以上分析了USB设备枚举过程中的第二步:Get_Descriptor阶段的控制传输。其他的步骤大同小异,都是主机端发起,然后USB设备通过中端来处理。依次经过文中最前面提到的六步,USB主机就识别咱们的设备了 。








热点排行