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


                    

DM816X 实现 USB HID Gadget 鼠标键盘功能

DM816X 实现 USB HID Gadget 鼠标键盘功能 主要实现让dm8168被识别成鼠标和键盘,通过网络给dm8168发命令,来实现远程操作和dm8168相连接的PC。...

usb hid gadget模拟鼠标键盘

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

usb hid gadget驱动

一 usb gadget框架层次 1 驱动层 2 复合层 3 控制器驱动层 二 初始化流程 1 驱动层介绍 2 hidg驱动初始化详解 1 至上而下遍历搜索绑定驱动和设备 2 至下而上遍历完成初始化 ...
  • abcamus
  • abcamus
  • 2016年10月31日 10:13
  • 1235

Linux USB gadget设备驱动解析(2)---驱动调试

分类: LINUX 作者:刘洪涛, 华清远见嵌入式学院金牌讲师。 这一节主要把在实现“linux模拟U盘功能”过程中的一些调试过程记录下来,并加以解析。 一、背景...

USB Gadget Storage功能调试

由于工作的需要,实现板卡通过Micro USB线与PC连接,作为PC的 外设存储,PC拷贝数据到板卡中,或者把板卡中的数据通过USB线拷贝到PC端,实现数据的交互,板卡采用Linux操作系统,笔者采用...

Linux USB gadget设备驱动解析(2)---驱动调试

Linux USB gadget设备驱动解析(2)---驱动调试 作者:刘老师, 华清远见嵌入式学院金牌讲师。 这一节主要把在实现“linux模拟U盘功能”过程中的一些调试过程记录下来,并...

USB-HID调试过程分享(1)

2017-1-22 采用网络上分享的描述符,设置相关配置信息如下: const UINT8 C_abyUsbDeviceDescriptor[18] =   //USB设备描述符 {     0x12...
  • cnskycn
  • cnskycn
  • 2017年01月22日 11:21
  • 181

Linux Gadget的一点研究之HID设备

接上文,配置编译gadget HID模块 make modules后在driver/usb/gadget目录下生成g_hid.ko 执行加载命令: root@rfODNCC:/mnt# insm...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:usb hid gadget调试
举报原因:
原因补充:

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