开发平台:飞凌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 #endifs3c6410 和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。