搜索
bottom↓
回复: 12

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

[复制链接]

出0入0汤圆

发表于 2013-4-10 15:08:27 | 显示全部楼层 |阅读模式


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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-4-11 12:19:05 | 显示全部楼层
EZ-USB 具体是哪块芯片,只改了PID和VID?从机的设备和端点的描述是否和驱动相符。

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

出0入0汤圆

 楼主| 发表于 2013-4-11 14:58:08 | 显示全部楼层
yzdel7 发表于 2013-4-11 12:19
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()函数则一直阻塞。
谢谢解答!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-4-11 15:33:18 | 显示全部楼层
yzdel7 发表于 2013-4-11 12:19
EZ-USB 具体是哪块芯片,只改了PID和VID?从机的设备和端点的描述是否和驱动相符。

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


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-4-12 22:26:09 | 显示全部楼层
芯片是 CY7068013A? 是不是应该是 CY7C68013A ,你再查查。

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

注意这些信息:

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

struct usb_endpoint_descriptor {

__u8  bLength;
__u8  bDescriptorType;
    __u8  bEndpointAddress;

    __u8  bmAttributes;

    __le16 wMaxPacketSize;

    __u8  bInterval;

__u8  bRefresh;
__u8  bSynchAddress;
} __attribute__ ((packed));

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

出0入0汤圆

 楼主| 发表于 2013-4-13 13:41:03 | 显示全部楼层
本帖最后由 qgrom0624 于 2013-4-13 13:42 编辑
yzdel7 发表于 2013-4-12 22:26
芯片是 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接口有数据输出。
非常感谢!

出0入0汤圆

发表于 2013-4-13 15:59:19 | 显示全部楼层
本帖最后由 yzdel7 于 2013-4-13 16:01 编辑

问题解决了就好。

出0入0汤圆

 楼主| 发表于 2013-4-13 16:35:44 | 显示全部楼层
yzdel7 发表于 2013-4-13 15:59
问题解决了就好。

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

出0入0汤圆

发表于 2013-4-15 03:39:38 | 显示全部楼层
本帖最后由 yzdel7 于 2013-4-15 03:40 编辑

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

出0入0汤圆

 楼主| 发表于 2013-4-15 13:36:09 | 显示全部楼层
yzdel7 发表于 2013-4-15 03:39
endpoint.desc 的赋值在哪里,你查一下你下位机USB芯片的配置文件,
传输端点的详细信息,包括端点的缓冲区 ...

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

出0入0汤圆

 楼主| 发表于 2013-4-15 14:05:05 | 显示全部楼层
yzdel7 发表于 2013-4-15 03:39
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
如上,前面两条信息分别对应上面输出端点的信息,后两条对应输入端点的信息,端点设置应该没有问题。

出0入0汤圆

 楼主| 发表于 2013-4-19 16:05:24 | 显示全部楼层
问题已解决,是因为在做USB数据传输之前,需要先向usb芯片发送一条命令,然后再向芯片写数据。

出0入0汤圆

发表于 2013-4-19 21:40:28 | 显示全部楼层
不错学习了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 10:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表