linux内核带usb驱动,Linux3.4内核USB驱动的移植

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

作者:李老师,华清远见嵌入式学院讲师。

【实验目的】

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盘内容,即完成实验。

linux内核带usb驱动,Linux3.4内核USB驱动的移植_第1张图片

你可能感兴趣的:(linux内核带usb驱动)