s3c6410之USB驱动error -62

开发平台:飞凌OK6410

内核版本:linux 2.6.28

问题描述:usb下载线接入pc机,开发板串口打印错误信息:

                 “new full speed USB device using s3c2410-ohci and address 2”

(ohci--open host controller interface 开放主机控制器接口协议)

说明使用的是s3c2410-ohci的驱动程序,没有重新开发s3c6410-ohci驱动程序。

链接:http://hi.baidu.com/zeracgzzizbiote/item/c5ebf1318fc364c2382ffa1c

给出了错误信息定位,并给出了解决办法--配置好usb控制器的时钟。

供应商给出的内核移植版本,配置驱动如下:

#if define(CONFIG_ARCH_S3C2410)||define(CONFIG_ARCH_S3C64XX)||define(CONFIG_ARCH_S5PC1XX)
#include "ohci-s3c2410.c"
#define PLATFORM_DRIVER ohci_hcd_s3c2410_driver
#endif
s3c6410 和s5pv100都是用的s3c2410的驱动。驱动数据结构如下:

static struct platform_driver ohci_hcd_s3c2410_driver = {
	.probe		= ohci_hcd_s3c2410_drv_probe,
	.remove		= ohci_hcd_s3c2410_drv_remove,
	.shutdown	= usb_hcd_platform_shutdown,
	/*.suspend	= ohci_hcd_s3c2410_drv_suspend, */
	/*.resume	= ohci_hcd_s3c2410_drv_resume, */
	.driver		= {
		.owner	= THIS_MODULE,
		.name	= "s3c2410-ohci",
	},
};
定位函数ohci_hcd_s3c2410_drv_probe函数,发现已经有usb时钟设置函数,直接跟踪到arch/arm/mach-s3c6410/mach-smdk6410.c函数里面,发现了usb_host_clk_en函数,这个函数就是配置usb-host时钟的部分。

void usb_host_clk_en(void) {
	struct clk *otg_clk;

        switch (S3C_USB_CLKSRC) {
	case 0: /* epll clk */
		writel((readl(S3C_CLK_SRC)& ~S3C6400_CLKSRC_UHOST_MASK)
			|S3C_CLKSRC_EPLL_CLKSEL|S3C_CLKSRC_UHOST_EPLL,
			S3C_CLK_SRC);

		/* USB host colock divider ratio is 2 */
		writel((readl(S3C_CLK_DIV1)& ~S3C6400_CLKDIV1_UHOST_MASK)
			|(1<<20), S3C_CLK_DIV1);
		break;
	case 1: /* oscillator 48M clk */
		otg_clk = clk_get(NULL, "otg");
		clk_enable(otg_clk);
		writel(readl(S3C_CLK_SRC)& ~S3C6400_CLKSRC_UHOST_MASK, S3C_CLK_SRC);
		otg_phy_init();

		/* USB host colock divider ratio is 1 */
		writel(readl(S3C_CLK_DIV1)& ~S3C6400_CLKDIV1_UHOST_MASK, S3C_CLK_DIV1);
		break;
	default:
		printk(KERN_INFO "Unknown USB Host Clock Source\n");
		BUG();
		break;
	}

	writel(readl(S3C_HCLK_GATE)|S3C_CLKCON_HCLK_UHOST|S3C_CLKCON_HCLK_SECUR,
		S3C_HCLK_GATE);
	writel(readl(S3C_SCLK_GATE)|S3C_CLKCON_SCLK_UHOST, S3C_SCLK_GATE);

}
在文件arch/arm/plat-s3c64xx/include/plat/regs-clock.h中定义了上面函数的配置参数:

#define S3C_CLK_SRC        S3C_CLKREG(0x1C)
#define S3C_CLKSRC_UHOST_MASK           (3<<5)
#define S3C_CLKSRC_EPLL_CLKSEL          (1<<2)
#define S3C_CLKSRC_UHOST_EPLL           (1<<5)
#define S3C_CLK_DIV1        S3C_CLKREG(0x24)
#define S3C6400_CLKDIV1_UHOST_MASK    (0xf << 20)

配置S3C_USB_CLKSRC为0,采用epll clk,编译内核,问题就解决了。原来配置成48Mhz的时钟,会出现usb error -62。







你可能感兴趣的:(s3c6410之USB驱动error -62)