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等文件,将相关文件编译进内核,根据错误提示修改即可,错误都不复杂,主要就是找不到文件、或者少了什么定义的问题
// 作者: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等文件,将相关文件编译进内核,根据错误提示修改即可,错误都不复杂,主要就是找不到文件、或者少了什么定义的问题
相关文章推荐
- Real6410移植linux-2.6.39.1记录(3)-USB驱动移植(USB HOST以及USB OTG)
- Real6410移植linux-2.6.39.1记录(2)-LCD驱动移植
- Real6410移植linux-2.6.39.1记录(1)-启动cramfs根文件系统
- yaffs2移植到内核linux-4.4.16的修改记录
- STM32F4 LAN8720以及LWIP的移植调试记录 (3)
- 【linux】linux内核移植错误记录
- 移植linphone到arm-linux日志记录
- Linux 下如何 sql*plus 实现上下键历史记录显示(安装rlwrap 以及 readline)
- real6410移植linux2.6.39.4内核(1)-内核移植环境的搭建及测试
- build移植移植linphone到arm-linux日志记录
- 【TINY4412】LINUX移植笔记:(10)USB OTG
- 移植linux3.4.2以及文件系统制作笔记
- 在Linux源码采用make menuconfig 出现的一个错误以及解决办法的记录
- Linux以及Android开发中的小技巧和长繁命令记录收集
- 【linux】linux内核移植错误记录
- [记录]移植驱动完毕后加载时的version magic报错原因以及解决办法(invalid module format)
- open-vmdk在linux编译时候 zlib.h的头文件问题 以及在windows使用zlib的资料查找记录
- tensorflow在openwrt等嵌入式linux系统上的移植以及NEON优化
- linux移植yaffs2文件时候遇到的busybox的问题,以及烧写yaffs2文件时候的问题及解决
- STM32F4 LAN8720以及LWIP的移植调试记录 (2)