主题 : g_zero不能正常工作的调试笔记 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 13593
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
综合积分: 32 分
注册时间: 2010-01-26
最后登录: 2012-08-06
楼主  发表于: 2010-07-20 22:31

 g_zero不能正常工作的调试笔记

g_zero不能正常工作的调试笔记

使用friendly提供的2.26.32内核在micro2440平台上做linux usb gadget 测试时,发现g_zero.ko虽然可以加载,加载后也可以在电脑上认出设备,但是该设备不能正常工作,经过一天的调试和代码修改,终于使其可以正常工作了;
发现f_sourcesink.c中的enable_source_sink(。。。)函数中,usb_ep_enable函数返回参数是-22(-EINVAL;不正确的参数);该函数对应的源码为kernel/driver/usb/gadget/s3c2410_udc.c中的s3c2410_udc_ep_enable()函数;相关代码贴如下
static int s3c2410_udc_ep_enable(struct usb_ep *_ep,
                 const struct usb_endpoint_descriptor *desc)
{
    struct s3c2410_udc    *dev;
    struct s3c2410_ep    *ep;
    u32            max, tmp;
    unsigned long        flags;
    u32            csr1,csr2;
    u32            int_en_reg;

    ep = to_s3c2410_ep(_ep);

    if (!_ep || !desc || ep->desc
            || _ep->name == ep0name
            || desc->bDescriptorType != USB_DT_ENDPOINT)
        return -EINVAL;


其中!_ep||!Desc||_ep->name==ep0name确定为0,
则可能的原因在于ep->desc 或 desc->bDescriptorType != USB_DT_ENDPOINT

ep = to_s3c2410_ep(_ep);中函数 to_s3c2410_ep(。。。)的原型是

static inline struct s3c2410_ep *to_s3c2410_ep(struct usb_ep *ep)
{
    return container_of(ep, struct s3c2410_ep, ep);
}

还有
struct s3c2410_ep {
    struct list_head        queue;
    unsigned long            last_io;    /* jiffies timestamp */
    struct usb_gadget        *gadget;
    struct s3c2410_udc        *dev;
    const struct usb_endpoint_descriptor *desc;
    struct usb_ep            ep;
    u8                num;

    unsigned short            fifo_size;
    u8                bEndpointAddress;
    u8                bmAttributes;

    unsigned            halted : 1;
    unsigned            already_seen : 1;
    unsigned            setup_stage : 1;
};

如果是因为ep->desc,则说明是某处给s3c2410_ep赋值但没有清除,这个赋值可能不是我们主动做的而是系统函数做的;解决办法是在usb_ep_enable调用之前始终调用usb_ep_disable函数;

发现src = ep_choose(cdev->gadget, &hs_source_desc, &fs_source_desc);也会导致usb_ep_enable()出错,修改为sink=&fs_sink_desc;时可以解决问题(S3C2440的udc是full speed的,所以这样改不会出现问题),说明在速度判断方面也存在问题,需要进一步探讨。


级别: 新手上路
UID: 23457
精华: 0
发帖: 24
金钱: 130 两
威望: 26 点
综合积分: 48 分
注册时间: 2010-06-20
最后登录: 2017-09-13
1楼  发表于: 2010-07-21 14:18
谢谢楼主!
我的一个USB Gadget驱动也会出现usb_ep_enable()的错误。
先按照你的方法试一下,看是否可以解决。
级别: 新手上路
UID: 23457
精华: 0
发帖: 24
金钱: 130 两
威望: 26 点
综合积分: 48 分
注册时间: 2010-06-20
最后登录: 2017-09-13
2楼  发表于: 2010-07-22 09:25
添加楼主的修改之后就不会再出现usb_ep_enable函数的错误了。
谢谢!