关闭

usb hid gadget调试

1386人阅读 评论(2) 收藏 举报
分类:
usb hid gadget调试
 在PC上可以使用usbview 查看usb设备的信息, ubuntu可以下载tgz的包,编译一下就可以,感觉比较实用。
 在调试hid  gadget时,发现接收数据时多了一个数据头(struct
usb_ctrlrequest),并且第一次接收不到数据,为了查找原因,看了一下内核代码,使用的是A20芯片。
gadget驱动,linux本身有框架可以看一下内核代码(drivers/usb/gadget)。usb接收过来的数据存放在struct
usb_request结构中,发现此时的数据就是错误的,只能看udc驱动代码(负责从usb总线接收/发送数据,一般有芯片厂商编写),每个平台有差异,但框架是相同的,底层的所有数据传输主要是在
udc的中断控制函数中处理的,一般都是通过request_irq注册一个中断处理函数xx_udc_irq(),usb通信都是由host发起的,gadget只能通过中断来处理所有的操作。可以参考一下s3c2410_udc.c,发现大家的实现都是一样的,名字差不多。
中断处理函数xx_udc_irq()中处理,gadget的枚举操作,都在里面处理,通过EP0(控制传输)的处理根据中断调用xx_udc_handle_ep0(),
其他方式的传输(中断,批量,实时)调用xx_udc_handle_ep()
 调试发现hid
gadget使用的是EP0来接收host发过来的数据,使用中断传输发送hid数据到host。跟踪xx_udc_handle_ep0(),发现接收数据经历了3个状态,EP0_IDLEEP0_OUT_DATA_PHASEEP0_IDLE,应该是host发送了3次中断。
 第一个EP0_IDLE状态:
 首先if(list_empty(&ep->queue)),此时队列为空,
 然后是s3c2410_udc_handle_ep0_idle(dev,
ep, &crq, ep0csr); 
在里面调用xx_udc_read_fifo_crq(crq),多的数据头就是这个crq,经过一些处理后,会调用setup()函数,在写gadget上层驱动是实现的,方式是dev->driver->setup(&dev->gadget,
crq);
setup函数中会有一个入队的操作,即上面的队列,usb_ep_queue(cdev->gadget->ep0,
req, GFP_ATOMIC)此函数在。
 dev->ep0state状态会被设置为EP0_OUT_DATA_PHASE

 第二个EP0_OUT_DATA_PHASE状态:
if(list_empty(&ep->queue)),此时队列不为空,就是上面的setup入对的。
xx_udc_read_fifo(ep,req);会把实际的数据从epFIFO读到req中,最后放入struct
usb_request结构中,当我们应用层调用文件read函数是就是从这里得到实际的数据。
 第三个EP0_IDLE状态
 此时队列为空,其它没有跟踪。

我们的hid通过crq->bRequest类型为USB_REQ_SET_CONFIGURATION来接收数据的,的标准类型会USBUSB_TYPE_STANDARDUSB_REQ_SET_CONFIGURATION类型时,完成后,就会往寄存器REG_CSR0中写一个数据接收完成的标志。而我们使用hid发送数据时,虽然使用的也是USB_REQ_SET_CONFIGURATION类型,但是后面还有数据(实际的数据),所以不能往寄存器REG_CSR0中写数据接收完成标记。否则会导致队列状态异常,三个状态混乱,表现是接收不到第一次发送的数据,后面读到的数据都是一个数据头。
 
其中有一个函数xx_udc_done()比较重要,每次中断处理完成后调用,里面实际是回调上层注册函数,功能一般是唤醒应用程序的read进程。调用方式是req->req.complete(&ep->ep,
&req->req)
 注:	1.
struct usb_ctrlrequesthost传给gadget设备的。
 		2. usb设备的EP有几个应该是硬件厂商定的,
 一般在udc代码里
 		3.
hid怎么选择使用芯片的那个EP。通过函数usb_ep_autoconfig()来检测选择使用的端点。
		4. USB HID类可采用的通信管道
		所有的HID设备通过USB的控制管道(默认管道,即端点0)和中断管道与主机通信。
		控制管道主要用于以下3个方面:
		接收/响应USB主机的控制请示及相关的类数据
		USB主机查询时传输数据(如响应Get_Report请求等)
		接收USB主机的数据
		中断管道主要用于以下两个方面:
		USB主机接收USB设备的异步传输数据
		USB主机发送有实时性要求的数据给USB设备
		USB主机到USB设备的中断输出数据传输是可选的,当不支持中断输出数据传输时,USB主机		通过控制管道将数据传输给USB设备。
USB HID规范定义的HID设备可用端点
管道             要求                      说明
控制(端点0)       必须                                                传输USB描述符、类请求代码以及供查询的消息数据等
中断输入                       必须                   			      传输从设备到主机的输入数据
中断输出                       可选                                                传输从主机到设备的输出数据
     
     
     
     


   
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:37770次
    • 积分:554
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:37篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论
  • usb hid gadget调试

    lionwes: 目前遇到问题,如果用read /dev/hidg0 不能成功,同时也没有产生中断。您是如何处理设备端...

  • usb hid gadget调试

    lionwes: 目前遇到问题,如果用read /dev/hidg0 不能成功,同时也没有产生中断。您是如何处理设备端...