usb hid gadget调试

原创 2015年11月20日 11:41:16
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描述符、类请求代码以及供查询的消息数据等
中断输入                       必须                   			      传输从设备到主机的输入数据
中断输出                       可选                                                传输从主机到设备的输出数据
     
     
     
     



            
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Qt USB通信--hidapi的使用

前面提高过Qt USB通信四种方案,这里详细介绍我使用的hidapi第三方库。从官网上下载到最新的压缩包hidapi-0.7.0.zip,解压后查看README.txt,里面介绍了三种Windows、...

usb hid gadget模拟鼠标键盘

在lichee/linux-3.3/drivers/usb/gadget

LINUX 自定义USB Gadget HID 设备

最近在搞自定义的hid设备,内核版本3.15 首先配置内核,进入Device driver 菜单  [*] USB support  --->   进入此菜单 选择最后一项    USB Gadge...
  • a_tu_
  • a_tu_
  • 2015-01-22 17:05
  • 3391

Linux USB gadget设备驱动解析(4)--编写一个gadget驱动

作者:刘洪涛,华清远见嵌入式学院讲师。一、编写计划通过前面几节的基础,本节计划编写一个简单的gadget驱动。重在让大家快速了解gadget驱动结构。上节中简单介绍了zero.c程序。这个程序考虑到了...

linux usb_gadget:设备控制器驱动测试(包含更新主机内核的方法)

简介         当

USB开发基础--USB命令(请求)和USB描述符

一、USB命令   在USB规范里,对命令一词提供的单词为“Request”,但这里为了更好的理解主机与设备之间的主从关系,将它定义成“命令”。   所有的USB设备都要求对主机发给自己的...
  • wdsfup
  • wdsfup
  • 2015-11-20 11:45
  • 1557

USB开发基础--实例讲解USB的枚举(配置)过程

在阅读本言之前建议您先看看百合电子工作室(www.baiheee.com)的另两篇文章: USB开发基础--了解USB的通讯过程和USB开发基础--USB命令(请求)和USB描述符。 所需要工具...
  • wdsfup
  • wdsfup
  • 2015-11-20 11:43
  • 1090
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)