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