当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > Linux3.4内核USB驱动的移植
Linux3.4内核USB驱动的移植
时间:2016-12-13作者:华清远见

【实验目的】

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 <mach/regs-clocks.h>
        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盘内容,即完成实验。

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)