我的BBB之路——5

3240阅读 0评论2013-12-19 哭泣的土地
分类:嵌入式

总算是可以运行了,通过usb转RS 232线页看到了启动页面,并成功进入系统,但是在系统关闭后却发现了一个问题,就是最后提示"gadget not registered."。既然是学习,就从排除问题开始吧,追踪代码。
发现这个提示出现在drivers/usb/gadget/udc-core.c文件的usb_del_gadget_udc(struct usb_gadget *gadget)函数中,也就是说上层某个函数错误调用了usb_del_gadget_udc(struct usb_gadget *gadget)函数,进一步追踪看都是谁调用了它。
追踪到了drivers/usb/gadget/musb-gadget.c文件void musb_gadget_cleanup(struct musb *musb)函数,调用该函数的上层函数主要存在于
drivers/usb/gadget/musb-core.c文件的static void musb_shutdown(struct platform_device *pdev)和static void musb_remove(struct platform_device *pdev)函数,
打印输出,发现只有前者调用了musb_gadget_cleanup。
这是个shutdown函数,追踪probe函数发现调用了
static int
musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)

它在调用 musb_gadget_setup(musb)是有条件的,而shutdown调用musb_gadget_cleanup(struct musb *musb)函数却是无条件的。这就导致了错误的调用。进一步检查发现musb_gadget_cleanup(struct musb *musb)函数只针对类型不是MUSB_HOST才生效,于是将static void musb_shutdown(struct platform_device *pdev)修改为

static void musb_shutdown(struct platform_device *pdev)
{
    struct device *dev = &pdev->dev;
    struct musb    *musb = dev_to_musb(dev);
    struct musb_hdrc_platform_data *plat = dev->platform_data;
    struct usb_hcd        *hcd = musb_to_hcd(musb);
    unsigned long    flags;

    pm_runtime_get_sync(musb->controller);

    
    if (plat->mode == MUSB_HOST)
        usb_remove_hcd(hcd);
    else
        musb_gadget_cleanup(musb);

    spin_lock_irqsave(&musb->lock, flags);
    musb_platform_disable(musb);
    musb_generic_disable(musb);
    spin_unlock_irqrestore(&musb->lock, flags);

    musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
    musb_platform_exit(musb);

    pm_runtime_put(musb->controller);
    /* FIXME power down */
}



重新编译,ok,故障排除。


经检查,更高版本的内核中已经修正了这个bug。

上一篇:我的BBB之路——4
下一篇:我的BBB之路——6