作者:李老师,华清远见嵌入式学院讲师。 【实验目的】 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盘内容,即完成实验。
|