Real6410移植linux-2.6.39.1记录(3)-USB驱动移植(USB HOST以及USB OTG)

// 主题:Real6410移植linux-2.6.39.1

// 作者:kevinjz2010@gmail.com

// 版权:kevinjz原创

// 平台:linux-2.39.1 real6410 (real6410开发板)

// 发布日期:2011-06-24

// 最后修改:2011-06-24

// 注意事项:欢迎转载,但不得在转载的时候擅自修改、删除文章的任何部分

//-------------------------------------------------------------------------------------------------

 

参照28内核以及此文(http://hi.baidu.com/aokikyon/blog/item/3785a22b9f1ffaf0e6cd40a4.html)修改

1、修改USB驱动的KCONFIGdrivers/usb/Kconfig

找到config USB_ARCH_HAS_OHCI

添加efault y if ARCH_S3C64XX

 

2、查找drivers/usb/host/ohci-hcd.c

后段程序是否包含:

#if defined(CONFIG_ARCH_S3C2410) || defined(CONFIG_ARCH_S3C64XX)

#include "ohci-s3c2410.c"

#define PLATFORM_DRIVER ohci_hcd_s3c2410_driver

#endif

未包含则加上并在ohci-s3c2410.c 文件中包含

3、检查/arch/arm/plat-samsung/dev-usb.c中的USBplatform信息是否存在,并检查设备名和第二步上面的驱动名是否相同。

并注意:EXPORT_SYMBOL(s3c_device_ohci);

 

4、修改arch/arm/mach-s3c64xx/mach-real6410.c

加入头文件:

#include <plat/regs-usb-hsotg.h>

#include <plat/regs-usb-hsotg-phy.h>

#include <linux/usb/ch9.h>

#include <plat/clock.h>

#include <plat/clock-clksrc.h>

#include <mach/regs-clock.h>

其中注意#include <plat/clock.h>需要放在#include <plat/clock-clksrc.h>之前,不然,clksrc定义中会找不到clk的引用

 

platform_device *real6410_devices[] __initdata中添加

&s3c_device_ohci

 

5、添加时钟初始化函数,从28内核中复制过来

void usb_host_clk_en(int S3C_USB_CLKSRC) {

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)

|(0<<20), S3C_CLK_DIV1);//这里需要修改1<<20,改为0<<20,查看手册第三章看为什么

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;

}

接着在real6410_machine_init();中调用

#ifdef CONFIG_USB_OHCI_HCD
usb_host_clk_en(0);
#endif

//
此步将usb使用源选为EPLL

 

6、将28内核中的/arch/arm/plat-s3c64xx/include/plat/regs-clock.h中的内容复制到

39内核中的plat/regs-clock.h中,最好是对比一下两个文件,然后复制其中缺少的。

 

7、修改UB00T中的CPU时钟初始化代码

/home/kevinjz/ELinux/REAL6410/s3c-u-boot-1.1.6-Real6410/board/samsung/smdk6410/lowlevel_init.S中搜#EPLL_CON0_OFFSET

ldr r1, =0x80200203改为

ldr r1, =0x80200103

//此步将EPLL使用修改为48MUSB设备要求48MHZ

 

8、配置内核选项

$make menuconfig

选中device drivers->SCSI device support

选中device drivers->HID Devices->USB Human Interface Device (full HID) support

选中device drivers->USB support :

Support for Host-side USB

USB announce new devices USB device filesystem (DEPRECATED) USB device class-devices (DEPRECATED) Dynamic USB minor allocation

USB Monitor

OHCI HCD support

USB Mass Storage support

USB Attached SCSI

USB Serial Converter support ---> USB Serial Console device support USB Generic Serial Driver

另外确保在file systems选择好了USB设备常用的文件系统:NTSFVFATFATMSDOS

 

9、编译下载,启动后

mount -t ntfs /dev/sda1 /mnt/udisk

<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->

10、USB OTG驱动

关键是记得在arch/arm/mach-s3c64xx/cpu.c中添加USBOTGPA-VA转换表的初始化信息,说白了就是将自己在map-base.h中定义的相关外设的VA(虚拟地址)和在map.h中定义的相关外设的PA(物理地址)联系起来,否则定义了也没用。

其他的只要把real28内核drivers/usb/host/中的s3c-otg文件夹复制到39内核相应位置,然后修改kconfigmakefile等文件,将相关文件编译进内核,根据错误提示修改即可,错误都不复杂,主要就是找不到文件、或者少了什么定义的问题

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值