g,通过观察ohci-hcd.c文件,发现其实它其实已经包括了很多其他的ohci文件。那么寄存器又是怎么操作的呢?下面这段代码来自于ohci.h文件。
static inline unsigned int _ohci_readl (const struct ohci_hcd *ohci,
__hc32 __iomem * regs)
{
#ifdef CONFIG_USB_OHCI_BIG_ENDIAN_MMIO
return big_endian_mmio(ohci) ?
readl_be (regs) :
readl (regs);
#else
return readl (regs);
#endif
}
static inline void _ohci_writel (const struct ohci_hcd *ohci,
const unsigned int val, __hc32 __iomem *regs)
{
#ifdef CONFIG_USB_OHCI_BIG_ENDIAN_MMIO
big_endian_mmio(ohci) ?
writel_be (val, regs) :
writel (val, regs);
#else
writel (val, regs);
#endif
}
#define ohci_readl(o,r) _ohci_readl(o,r)
#define ohci_writel(o,v,r) _ohci_writel(o,v,r)
h,看到这里,你应该发现大部分底层操作其实也都是ohci帮助一起完成的。每个host driver其实就是注册了一下,告知了mem地址在哪。下面这段代码就是ohci-s3c2410.c中probe函数的代码。
hcd->regs = devm_ioremap_resource(&dev->dev, &dev->resource[0]);
if (IS_ERR(hcd->regs)) {
retval = PTR_ERR(hcd->regs);
goto err_put;
}
4、usb驱动怎么学
如果从代码结构来说,上面这段分析算是入门了。但是,如果要深入了解usb host&device驱动,那么除了这些代码逻辑,那么还要熟读usb协议手册,更重要的学会用catc协议分析仪真正地去了解usb是如何发包和收包的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。








