您的位置:首页 > 运维架构 > Linux

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

2011-06-24 09:12 417 查看
// 主题: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驱动的KCONFIG:drivers/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使用修改为48M,USB设备要求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设备常用的文件系统:NTSF、VFAT、FAT、MSDOS等

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中添加USBOTG的PA-VA转换表的初始化信息,说白了就是将自己在map-base.h中定义的相关外设的VA(虚拟地址)和在map.h中定义的相关外设的PA(物理地址)联系起来,否则定义了也没用。
其他的只要把real28内核drivers/usb/host/中的s3c-otg文件夹复制到39内核相应位置,然后修改kconfig、makefile等文件,将相关文件编译进内核,根据错误提示修改即可,错误都不复杂,主要就是找不到文件、或者少了什么定义的问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: