该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
作者:李老师,华清远见嵌入式学院讲师。
【实验目的】
USB接口是现在计算机系统中最通用的一种接口,通过移植USB驱动,了解Linux3.4内核与Linux2.6内核的不同,并且掌握USB驱动的实现原理。
说明:在本系统移植课程实验中命令行提示符“$”表示是在主机上执行,“#”表示在目标板执行。
【实验环境】
● 主机:Ubuntu 10.10 (64bit);
● 目标机:FS_S5PC100平台;
● 交叉编译工具链:arm-eabi-4.4.0(Android4.0.4自带交叉工具链);
【实验步骤】
1.添加USB驱动
添加针对我们板子的USB驱动及相关头文件
● 拷贝ohci-s3c2410.c 到drivers/usb/host/下
$ cp ohci-s3c2410.c drivers/usb/host/
● 拷贝regs-clock.h到 arch/arm/mach-s5pc100/include/mach/下
$ cpregs-clock.h arch/arm/mach-s5pc100/include/mach/
2.平台代码修改
● 修改drivers/usb/Kconfig
在(11行)
default y if ARCH_S3C2410
下面添加:
default y if ARCH_S5PC100
● 修改drivers/usb/host/ohci-hcd.c
在(1002行)
#if defined(CONFIG_ARCH_S3C2410) || defined(CONFIG_ARCH_S3C64XX)
修改为:
#if defined(CONFIG_ARCH_S3C2410) || defined(CONFIG_ARCH_S3C64XX) || defined(CONFIG_ARCH_S5PC100)
● 修改arch/arm/mach-s5pc100/include/mach/map.h
在map.h文件中添加如下内容:
#define S3C_PA_USBHOST (0xED400000)
● 修改arch/arm/plat-samsung/devs.c
把(1360行)
#ifdef CONFIG_S3C_DEV_USB_HOST
staticstruct resource s3c_usb_resource[] = {
[0] = DEFINE_RES_MEM(S3C_PA_USBHOST, SZ_256),
[1] = DEFINE_RES_IRQ(IRQ_USBH),
};
改为:
#ifdef CONFIG_S3C_DEV_USB_HOST
staticstruct resource s3c_usb_resource[] = {
[0] = DEFINE_RES_MEM(S3C_PA_USBHOST, SZ_256),
[1] = DEFINE_RES_IRQ(IRQ_UHOST),
};
● 修改arch/arm/mach-s5pc100/Kconfig
在(14行)
Config CPU_S5PC100
bool
select S5P_EXT_INT
select SAMSUNG_DMADEV
下面添加:
select S3C_DEV_USB_HOST
● 修改arch/arm/mach-s5pc100/mach-smdkc100.c
添加头文件:
1 #if defined (CONFIG_USB_SUPPORT)
2 #include
3 #endif
添加平台设备:
01 #if defined(CONFIG_USB_SUPPORT)
02 void usb_host_clk_en(void) {
03 /* Setting the epllclk to 48 MHz, P=3, M=96, S=3 */
04 writel((readl(S5P_EPLL_CON) & ~(S5P_EPLL_MASK)) | (S5P_EPLL_EN \
05 | S5P_EPLLVAL(96,3,3)), S5P_EPLL_CON);
06 writel((readl(S5P_CLK_SRC0) | S5P_CLKSRC0_EPLL_MASK), S5P_CLK_SRC0);
07 writel((readl(S5P_CLK_SRC1)&~S5P_CLKSRC1_UHOST_MASK),S5P_CLK_SRC1);
08
09 /* USB host clock divider ratio is 1 */
10 writel((readl(S5P_CLK_DIV2)&~S5P_CLKDIV2_UHOST_MASK),S5P_CLK_DIV2);
11 writel(readl(S5P_CLKGATE_D10)|S5P_CLKGATE_D10_USBHOST,S5P_CLKGATE_D10);
12 writel(readl(S5P_SCLKGATE0)|S5P_CLKGATE_SCLK0_USBHOST, S5P_SCLKGATE0);
13 }
14 #endif
● 添加平台设备列表
在smdkc100_device[]结构体数组中添加如下内容:
1 #if defined(CONFIG_USB_SUPPORT)
2 & s3c_device_ohci,
3 #endif
配置内核
$ make menuconfig
● 添加USB控制器支持:
Device Drivers --->
[*] USB support --->
Support for Host-side USB
OHCI HCD support
● 添加U盘支持:
Device Drivers --->
SCSI device support --->
SCSI device support
SCSI disk support
SCSI generic support
SCSI media changer support
Device Drivers --->
[*] USB support --->
USB Mass Storage support
添加文件系统及语言配置:
File systems --->
DOS/FAT/NT Filesystems --->
VFAT (Windows-95) fs support
-*- Native language support --->
Codepage 437 (United States, Canada)
Simplified Chinese charset (CP936, GB2312)
NLS ISO 8859-1 (Latin 1; Western European Languages)
ASCII (United States)
NLS UTF-8
编译内核
编译内核并拷贝到tftpboot下。
$ make zImage
$ cp arch/arm/boot/zImage /tftpboot
测试
启动目标板并在目标板上完成如下操作:
# mount -t vfat /dev/block/sda1 /mnt/sdcard
# ls /mnt/sdcard
可以查看到U盘内容,即完成实验。