qgrom0624 发表于 2013-4-10 15:08:27

请教 Linux USB驱动 没有数据输出



      最近想通过DM6467给FPGA发送数据,采用USB接口。USB芯片是一块EZ-USB,把FPGA插到ARM开发板上能够正确识别,但/dev下没有映射设备描述符,因此无法操作,只有自己来添加驱动了。我采用内核提供的usb-skeleton.c文件作为驱动骨架,修改了其中的PID和VID,编译后能够正确在DM6467上加载,且open和write都没有报错,驱动层的调试信息也显示正常,但通过示波器测试USB脚却没有数据输出,是否还需要修改其他地方呢?请高人指点一二,谢谢!

yzdel7 发表于 2013-4-11 12:19:05

EZ-USB 具体是哪块芯片,只改了PID和VID?从机的设备和端点的描述是否和驱动相符。

可否介绍一下详细的系统情况。

qgrom0624 发表于 2013-4-11 14:58:08

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()函数则一直阻塞。
谢谢解答!

qgrom0624 发表于 2013-4-11 15:33:18

yzdel7 发表于 2013-4-11 12:19 static/image/common/back.gif
EZ-USB 具体是哪块芯片,只改了PID和VID?从机的设备和端点的描述是否和驱动相符。

可否介绍一下详细的系 ...

另外,上一张图是没有加载驱动时所看到的,这一张是加载我修改的驱动所看到的,红色部分是driver的名称。

yzdel7 发表于 2013-4-12 22:26:09

芯片是 CY7068013A? 是不是应该是 CY7C68013A ,你再查查。

CY7C68013A 这边的配置信息能否提供。

注意这些信息:

/**************************************/

struct usb_endpoint_descriptor {

__u8bLength;
__u8bDescriptorType;
    __u8bEndpointAddress;

    __u8bmAttributes;

    __le16 wMaxPacketSize;

    __u8bInterval;

__u8bRefresh;
__u8bSynchAddress;
} __attribute__ ((packed));

/*************************************/

qgrom0624 发表于 2013-4-13 13:41:03

本帖最后由 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 15:59:19

本帖最后由 yzdel7 于 2013-4-13 16:01 编辑

问题解决了就好。

qgrom0624 发表于 2013-4-13 16:35:44

yzdel7 发表于 2013-4-13 15:59 static/image/common/back.gif
问题解决了就好。

不,问题没有解决,还在网上查找相关资料,看了一些相关的论文,方法跟我的差不多,不知道是哪个细节上没修改到。
正在努力解决!

yzdel7 发表于 2013-4-15 03:39:38

本帖最后由 yzdel7 于 2013-4-15 03:40 编辑

endpoint.desc 的赋值在哪里,你查一下你下位机USB芯片的配置文件,
传输端点的详细信息,包括端点的缓冲区大小,具体使用哪几个端点做数据传输。
从机的设备和端点描述在驱动里应该与芯片的配置文件一致。

qgrom0624 发表于 2013-4-15 13:36:09

yzdel7 发表于 2013-4-15 03:39 static/image/common/back.gif
endpoint.desc 的赋值在哪里,你查一下你下位机USB芯片的配置文件,
传输端点的详细信息,包括端点的缓冲区 ...

好的,我先检查一下程序中,看对该结构体赋值情况,另外,下位机的端点情况应该可以从上面那张图中就可以获取到吧?

qgrom0624 发表于 2013-4-15 14:05:05

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
如上,前面两条信息分别对应上面输出端点的信息,后两条对应输入端点的信息,端点设置应该没有问题。

qgrom0624 发表于 2013-4-19 16:05:24

问题已解决,是因为在做USB数据传输之前,需要先向usb芯片发送一条命令,然后再向芯片写数据。

qingfengh 发表于 2013-4-19 21:40:28

不错学习了
页: [1]
查看完整版本: 请教 Linux USB驱动 没有数据输出