整理USB的内容的内容已经几天了,写点东西作为总结。全部内容分三部分,第一部分主要内容是USB驱动在Linux系统中的具体实现方法;第二部分参考《Linux设备驱动程序(第三版)》中的内容总结USB驱动的结构;最后,总结一下USB协议。
一、 首先是对USB设备的得支持。
1、viarch/arm/mach-s3c64xx/mach-mini6410.c
在mach-mini6410.c中添加该函数,实现对时钟的初始化。在USB host 初始化的过程中没有对OTG时钟未进行初始化,所以在使用USB供能前先添加次设置。
#ifdefCONFIG_USB_SUPPORT
/* InitializesOTG Phy. to output 48M clock */
voids3c_otg_phy_config(int enable) {
u32 val;
if (enable) {
__raw_writel(0x0, S3C_PHYPWR); /* Power up */
val = __raw_readl(S3C_PHYCLK);
val &=~S3C_PHYCLK_CLKSEL_MASK;
__raw_writel(val, S3C_PHYCLK);
__raw_writel(0x1, S3C_RSTCON);
udelay(5);
__raw_writel(0x0, S3C_RSTCON); /* Finish the reset */
udelay(5);
} else {
__raw_writel(0x19, S3C_PHYPWR); /* Power down */
}
}
EXPORT_SYMBOL(s3c_otg_phy_config);
#endif
2、vi drivers/usb/host/ohci-s3c2410.c
ohci-s3c2410.c文件下存放的是S3C平台下对OHCI的所有操作。
Line26后添加内容:
#define valid_port(idx) ((idx) == 1 || (idx) == 2)
#ifdef CONFIG_MACH_MINI6410
extern void s3c_otg_phy_config(int enable);
#endif
/* clock device associated with the hcd */
static struct clk *clk;
static struct clk *otg_clk, *usb_clk;
/* forward definitions */
Line48,static voids3c2410_start_hc()函数中添加时钟初始化函数,如下
static voids3c2410_start_hc(struct platform_device *dev, struct usb_hcd *hcd)
{
。。。
clk_enable(otg_clk);
#ifdefCONFIG_MACH_MINI6410
s3c_otg_phy_config(1);
#endif
clk_enable(usb_clk);
。。。
}
以上修改经验证在3.1.6内核同样适用