请教 Linux USB驱动 没有数据输出
最近想通过DM6467给FPGA发送数据,采用USB接口。USB芯片是一块EZ-USB,把FPGA插到ARM开发板上能够正确识别,但/dev下没有映射设备描述符,因此无法操作,只有自己来添加驱动了。我采用内核提供的usb-skeleton.c文件作为驱动骨架,修改了其中的PID和VID,编译后能够正确在DM6467上加载,且open和write都没有报错,驱动层的调试信息也显示正常,但通过示波器测试USB脚却没有数据输出,是否还需要修改其他地方呢?请高人指点一二,谢谢! EZ-USB 具体是哪块芯片,只改了PID和VID?从机的设备和端点的描述是否和驱动相符。
可否介绍一下详细的系统情况。 yzdel7 发表于 2013-4-11 12:19 static/image/common/back.gif
EZ-USB 具体是哪块芯片,只改了PID和VID?从机的设备和端点的描述是否和驱动相符。
可否介绍一下详细的系 ...
USB芯片是CY7068013A,在内核提供的usb-skeleton.c文件中修改了
#define USB_SKEL_VENDOR_ID 0x0547
#define USB_SKEL_PRODUCT_ID 0x1002两个宏定义,这两个ID是将我的从设备插到ARM板子上读取出来的!见下图
测试中执行了usb_submit_urb()函数后,回调函数并没有执行,如果采用usb_bule_msg()函数则一直阻塞。
谢谢解答! yzdel7 发表于 2013-4-11 12:19 static/image/common/back.gif
EZ-USB 具体是哪块芯片,只改了PID和VID?从机的设备和端点的描述是否和驱动相符。
可否介绍一下详细的系 ...
另外,上一张图是没有加载驱动时所看到的,这一张是加载我修改的驱动所看到的,红色部分是driver的名称。
芯片是 CY7068013A? 是不是应该是 CY7C68013A ,你再查查。
CY7C68013A 这边的配置信息能否提供。
注意这些信息:
/**************************************/
struct usb_endpoint_descriptor {
__u8bLength;
__u8bDescriptorType;
__u8bEndpointAddress;
__u8bmAttributes;
__le16 wMaxPacketSize;
__u8bInterval;
__u8bRefresh;
__u8bSynchAddress;
} __attribute__ ((packed));
/*************************************/ 本帖最后由 qgrom0624 于 2013-4-13 13:42 编辑
yzdel7 发表于 2013-4-12 22:26 static/image/common/back.gif
芯片是 CY7068013A? 是不是应该是 CY7C68013A ,你再查查。
CY7C68013A 这边的配置信息能否提供。
对,芯片应该是7C,看错了!
我直接用的是内核提供的usb驱动框架,其中相应的配置代码如下:
/* set up the endpoint information */
/* use only the first bulk-in and bulk-out endpoints */
iface_desc = interface->cur_altsetting;
for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
endpoint = &iface_desc->endpoint.desc;
if (!dev->bulk_in_endpointAddr &&
(endpoint->bEndpointAddress & USB_DIR_IN) &&
((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
== USB_ENDPOINT_XFER_BULK)) {
/* we found a bulk in endpoint */
buffer_size = endpoint->wMaxPacketSize;
dev->bulk_in_size = buffer_size;
dev->bulk_in_endpointAddr = endpoint->bEndpointAddress;
dev->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
if (!dev->bulk_in_buffer) {
err("Could not allocate bulk_in_buffer");
goto error;
}
}
if (!dev->bulk_out_endpointAddr &&
!(endpoint->bEndpointAddress & USB_DIR_IN) &&
((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
== USB_ENDPOINT_XFER_BULK)) {
/* we found a bulk out endpoint */
dev->bulk_out_endpointAddr = endpoint->bEndpointAddress;
}
}
if (!(dev->bulk_in_endpointAddr && dev->bulk_out_endpointAddr)) {
err("Could not find both bulk-in and bulk-out endpoints");
goto error;
}
由于刚接触USB,对其不太了解,按照网上介绍的方法,直接调用这个驱动就可以测试到USB接口有数据输出。
非常感谢! 本帖最后由 yzdel7 于 2013-4-13 16:01 编辑
问题解决了就好。 yzdel7 发表于 2013-4-13 15:59 static/image/common/back.gif
问题解决了就好。
不,问题没有解决,还在网上查找相关资料,看了一些相关的论文,方法跟我的差不多,不知道是哪个细节上没修改到。
正在努力解决! 本帖最后由 yzdel7 于 2013-4-15 03:40 编辑
endpoint.desc 的赋值在哪里,你查一下你下位机USB芯片的配置文件,
传输端点的详细信息,包括端点的缓冲区大小,具体使用哪几个端点做数据传输。
从机的设备和端点描述在驱动里应该与芯片的配置文件一致。 yzdel7 发表于 2013-4-15 03:39 static/image/common/back.gif
endpoint.desc 的赋值在哪里,你查一下你下位机USB芯片的配置文件,
传输端点的详细信息,包括端点的缓冲区 ...
好的,我先检查一下程序中,看对该结构体赋值情况,另外,下位机的端点情况应该可以从上面那张图中就可以获取到吧? yzdel7 发表于 2013-4-15 03:39 static/image/common/back.gif
endpoint.desc 的赋值在哪里,你查一下你下位机USB芯片的配置文件,
传输端点的详细信息,包括端点的缓冲区 ...
我在proc/bus/usb/devices中获取到的下位机USB设备的情况如下:
T:Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=2 Spd=480 MxCh= 0
D:Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=1
P:Vendor=0547 ProdID=1002 Rev= 0.00
S:Manufacturer=Cypress
S:Product=EZ-USB FX2
C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=100mA
I:If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
E:Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:Ad=86(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
其中端点信息如上彩色部分,
在驱动中将获取到的端点信息打印如下:
USB DRIVER: endpoint->bEndpointAddress out 0x2
USB DRIVER: endpoint->wMaxPacketSize out 512
USB DRIVER: endpoint->bEndpointAddress in 0x86
USB DRIVER: endpoint->wMaxPacketSize in 512
如上,前面两条信息分别对应上面输出端点的信息,后两条对应输入端点的信息,端点设置应该没有问题。 问题已解决,是因为在做USB数据传输之前,需要先向usb芯片发送一条命令,然后再向芯片写数据。 不错学习了
页:
[1]