原帖地址:http://blog.csdn.net/xiaoxizi198807/article/details/6564880
// 主题: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等文件,将相关文件编译进内核,根据错误提示修改即可,错误都不复杂,主要就是找不到文件、或者少了什么定义的问题