注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

蒙奇D小豌豆的博客

蒙奇D小豌豆的学习记录

 
 
 

日志

 
 

华恒HHs3c6410内核USB HOST移植  

2010-05-04 22:52:18|  分类: others |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

移植驱动程序文件位置: /drivers/usb/host在我们下载的的2.6.29内核中已经存在

(1)首先看了S3C6410的数据手册,25章USB-HOST就薄薄两页,大意是你去参考OHCI手册吧,这说明S3C6410的USB基本上是做好的,兼容OHCI,不需要我们做太多修改。

 

(2)修改/drivers/usb/host/kconfig去掉USB_ARCH_HAS_OHCI变成

config USB_OHCI_HCD

    tristate "OHCI HCD support"

    depends on USB

(3)选择完毕,开始编译,发现以下问题:

CC      drivers/usb/host/ohci-hcd.o

drivers/usb/host/ohci-hcd.c:1091:2: error: #error "missing bus glue for ohci-hcd"

make[3]: *** [drivers/usb/host/ohci-hcd.o] 错误 1

make[2]: *** [drivers/usb/host] 错误 2

make[1]: *** [drivers/usb] 错误 2

make: *** [drivers] 错误 2

看了一下OHCI文件,发现要想三星芯片使用,需要包含ohci-s3c2410.c文件,如果没哟包含这个文件,就会提示找不到hcd的以上错误。

这段代码在ohci-hcd.c中是这样定义的

#ifdef CONFIG_ARCH_S3C2410

#include "ohci-s3c2410.c"

#define PLATFORM_DRIVER   ohci_hcd_s3c2410_driver

#endif

由于我们使用的是S3C6410,并没有CONFIG_ARCH_S3C2410,手动修改一下好了:

#ifdef CONFIG_ARCH_S3C64XX

#include "ohci-s3c2410.c"

#define PLATFORM_DRIVER   ohci_hcd_s3c2410_driver

#endif

对了还要添加usb-control.h 头文件 #include <asm/arch/usb-control.h>

(4)编译完毕后完全没有反应,参考2.6.24代码,发现需要添加platform-device注册信息:

还需要注册进平台设备:

/mach-smdk6410/mach-s3c6410.c添加

/* USB Host Controller */

static struct resource s3c_usb_resource[] = {

[0] = {

   .start = S3C24XX_PA_USBHOST,

   .end   = S3C24XX_PA_USBHOST + S3C24XX_SZ_USBHOST - 1,

   .flags = IORESOURCE_MEM,

},

#if !defined(CONFIG_CPU_S3C6400) && !defined(CONFIG_CPU_S3C6410)

[1] = {

   .start = IRQ_USBH,

   .end   = IRQ_USBH,

   .flags = IORESOURCE_IRQ,

}

#else

[1] = {

   .start = IRQ_UHOST,

   .end   = IRQ_UHOST,

   .flags = IORESOURCE_IRQ,

}

#endif

};

static u64 s3c_device_usb_dmamask = 0xffffffffUL;

struct platform_device s3c_device_usb = {

.name    = "s3c2410-ohci",

.id    = -1,

.num_resources   = ARRAY_SIZE(s3c_usb_resource),

.resource   = s3c_usb_resource,

.dev              = {   .dma_mask = &s3c_device_usb_dmamask,

   .coherent_dma_mask = 0xffffffffUL

}

};

EXPORT_SYMBOL(s3c_device_usb);

编译后还是发现错误,S3C24XX_SZ_USBHOST、S3C24XX_PA_USBHOST、IRQ_USBH都没有定义。

#define S3C6410_PA_USBHOST     (0x74300000)     /*physical  addr*/

#define S3C6410_SZ_USBHOST      SZ_1M

查找半天后发现HOST的物理地址0x74300000没有定义,手动填入这个地址好了。

至于中断号,开始我填了中断控制器中的位置47,可惜不对,后来发现头文件中有定义,填IRQ_USBH.

一下是修改后代码:

/* USB Host Controller add by rockie */

static struct resource s3c_usb_resource[] = {

[0] = {

   .start = S3C6410_PA_USBHOST,

   .end   = S3C6410_PA_USBHOST + S3C6410_SZ_USBHOST - 1,

   .flags = IORESOURCE_MEM,

},

[1] = {

   .start = IRQ_USBH,//IRQ_UHOST,

   .end   = IRQ_USBH,//IRQ_UHOST,

   .flags = IORESOURCE_IRQ,

}

};

static u64 s3c_device_usb_dmamask = 0xffffffffUL;

struct platform_device s3c_device_usb = {

.name    = "s3c2410-ohci",

.id    = -1,

.num_resources   = ARRAY_SIZE(s3c_usb_resource),

.resource   = s3c_usb_resource,

.dev              = {

   .dma_mask = &s3c_device_usb_dmamask,

   .coherent_dma_mask = 0xffffffffUL

}

};

EXPORT_SYMBOL(s3c_device_usb);

static struct platform_device *smdk6410_devices[] __initdata = {

...

&s3c_device_usb, //<——添加这句即可

...

}

(5)编译完毕,初始化怎么还是错误?

ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver

s3c2410-ohci s3c2410-ohci: S3C24XX OHCI

s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1

s3c2410-ohci s3c2410-ohci: irq 79, io mem 0x74300000

s3c2410-ohci s3c2410-ohci: init err (00000000 0000)

ohci_hcd: can't start s3c24xx

s3c2410-ohci s3c2410-ohci: startup error -75

s3c2410-ohci s3c2410-ohci: USB bus 1 deregistered

s3c2410-ohci: probe of s3c2410-ohci failed with error -75

Initializing USB Mass Storage driver...

usbcore: registered new interface driver usb-storage

USB Mass Storage support registered.

原来还要完成初始化时钟的函数:

/mach-smdk6410/mach-s3c6410.c

#if defined(CONFIG_USB_GADGET_S3C_OTGD) ||defined(CONFIG_USB_OHCI_HCD)

#include <asm/plat-s3c/regs-usb-otg-hs.h>

#include <linux/usb/ch9.h>

#endif

//add by wx 添加48M的时钟,2种方法 a. epll  b. 用otg-phy提供

/*************************************************************************************

* USB HOST

**************************************************************************************/

#ifdef CONFIG_USB_OHCI_HCD

/* Initializes OTG Phy. */

void otg_phy_init(u32 otg_phy_clk) {

    writel(readl(S3C_OTHERS)|S3C_OTHERS_USB_SIG_MASK, S3C_OTHERS);

    writel(0x0, S3C_USBOTG_PHYPWR);     //Power up

    writel(otg_phy_clk, S3C_USBOTG_PHYCLK);

    writel(0x1, S3C_USBOTG_RSTCON);

    udelay(50);

    writel(0x0, S3C_USBOTG_RSTCON);

    udelay(50);

}

EXPORT_SYMBOL(otg_phy_init);

 

#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)

void usb_host_clk_en(int usb_host_clksrc, u32 otg_phy_clk) {

    switch (usb_host_clksrc) {

    case 0: /* epll clk */

        writel((readl(S3C_CLK_SRC)& ~S3C_CLKSRC_UHOST_MASK)

            |S3C_CLKSRC_EPLL_CLKSEL|S3C_CLKSRC_UHOST_EPLL,

            S3C_CLK_SRC);   /*设置usb时钟源为epll*/

        /*set the epll regs*/

        writel(0x0,S3C_EPLL_CON1);   //设置epll寄存器使其输出为48M

        writel(USB_48M_CLCK,S3C_EPLL_CON0);

        /* USB host colock divider ratio is 1 */

        writel(readl(S3C_CLK_DIV1)& ~S3C_CLKDIVN_UHOST_MASK, S3C_CLK_DIV1);//设置分频为。

        break;

    case 1: /* oscillator 48M clk */

        writel(readl(S3C_CLK_SRC)& ~S3C_CLKSRC_UHOST_MASK, S3C_CLK_SRC);//设置usb时钟源为otg-phy

        otg_phy_init(otg_phy_clk);//初始化以及设置 otg-phy,48M

        /* USB host colock divider ratio is 1 */   //设置分频为1

        writel(readl(S3C_CLK_DIV1)& ~S3C_CLKDIVN_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);//开通HCLK usb gate

    writel(readl(S3C_SCLK_GATE)|S3C_CLKCON_SCLK_UHOST, S3C_SCLK_GATE);

//开通SCLK  usb  gate

}

EXPORT_SYMBOL(usb_host_clk_en);

#endif

然后在drivers\usb\host下的ohci-s3c2410.c上面添加

#if defined(CONFIG_PLAT_S3C64XX)

#define S3C_USB_CLKSRC_EPLL 0

#define S3C_USB_CLKSRC_48M  1

extern void usb_host_clk_en(int usb_host_clksrc, u32 otg_phy_clk);

#define OTGH_PHY_CLK_VALUE  (0x20)

#endif

 

在函数

static int usb_hcd_s3c2410_probe (const struct hc_driver *driver,

                  struct platform_device *dev)

添加

#if defined(CONFIG_PLAT_S3C64XX)

    usb_host_clk_en(S3C_USB_CLKSRC_EPLL, OTGH_PHY_CLK_VALUE);  //add by wx 第一种epll时钟获取

#endif

/*或者加上

#if defined(CONFIG_PLAT_S3C64XX)

    usb_host_clk_en(S3C_USB_CLKSRC_48M, OTGH_PHY_CLK_VALUE);  //add by wx 第二种otg-phy获取

#endif*/

对于上面寄存器的操作需要I/O映射,添加

static struct map_desc smdk6410_iodesc[] __initdata = {

    IODESC_ENT(SYSCON),

    IODESC_ENT(OTGSFR),

};

 

(6)修改后编译得出   (对了别忘了内核选项的filesystem加载时要选上fat )

s3c2410-ohci s3c2410-ohci: S3C OHCI

s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1

s3c2410-ohci s3c2410-ohci: irq 47, io mem 0x74300000

usb usb1: configuration #1 chosen from 1 choice

hub 1-0:1.0: USB hub found

hub 1-0:1.0: 2 ports detected

至此USB-HOST功能可以正常使用:

# usb 1-1: new full speed USB device using s3c2410-ohci and address 2

usb 1-1: configuration #1 chosen from 1 choice

scsi0 : SCSI emulation for USB Mass Storage devices

scsi 0:0:0:0: Direct-Access     PNY      Lovely Attache   PMAP PQ: 0 ANSI: 0 CCS

sd 0:0:0:0: [sda] 7831552 512-byte hardware sectors (4010 MB)

sd 0:0:0:0: [sda] Write Protect is off

sd 0:0:0:0: [sda] Assuming drive cache: write through

sd 0:0:0:0: [sda] 7831552 512-byte hardware sectors (4010 MB)

sd 0:0:0:0: [sda] Write Protect is off

sd 0:0:0:0: [sda] Assuming drive cache: write through

 sda: unknown partition table

sd 0:0:0:0: [sda] Attached SCSI removable disk

sd 0:0:0:0: Attached scsi generic sg0 type 0

 

# mount -t vfat /dev/sda /mnt

# cd /mnt

# ls

linux-2.6.28.tar.bz2

one.mp3

1.txt

xme30.zip

# cd ..

# umount

# usb 1-1: USB disconnect, address 2

至此USB HOST移植ok

  评论这张
 
阅读(1394)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018