总算是可以运行了,通过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。