http://blog.csdn.net/hanxuefan/article/details/7370050
Linux-2.6.32.2 內核對 USB外設的支持是相當豐富的,並且已經包含了 S3C2440 的 USB Host 驅動支持,因此我們只要配置一下內核就可以了,下面是各種USB外設的詳細配置步驟。
1.4.1 配置和測試 USB鍵盤、掃描器和鼠標
在內核源代碼目錄的終端輸入:make menuconfig,依次選擇如下子菜單項:
Device Drivers --->
[*] HID Devices --->
按空格鍵選中"USB Human Interface Device (full HID) support",這樣就配置好了 USB鍵盤和鼠標項。
提示:這裏的配置選項對應的內核源代碼目錄是:linux-2.6.32.2/drivers/hid/usbhid,其中 USB鍵盤和條碼掃描器的原理是一樣的,因此它們的代碼是相同的。
1.4.2 測試 USB鍵盤、掃描器和鼠標
在內核源代碼根目錄下執行:make zImage,把生成的新內核燒寫到開發板中,我們這裏依然使用友善之臂提供的文件系統 root_qtopia做測試,因爲它可以同時支持 USB 鍵盤、鼠標和觸摸屏,並且是支持熱插拔,所以使用起來十分方便。在前面的步驟中,我們通過觸摸屏點擊已經進入了 qtopia圖形系統,因此這裏直接找個 USB HUB,同時連上 USB鼠標和鍵盤,甚至是 USB 條碼掃描器就可以了,使用鼠標找到一個應用程序,比如 qtopia自帶的"便籤",點擊打開它,這時就可以使用鍵盤輸入各種英文字符了,還可以使用 USB條碼掃描器直接掃描條碼進行輸入。
1.4.3 配置優盤
(1)因爲優盤用到了 SCSI命令,所以我們先增加 SCSI 支持。
在 Device Drivers 菜單裏面,選擇 SCSI device support,再選擇SCSI disk support
(2)返回 Device Drivers菜單,再選擇 USB support,按回車進入 USB support菜單找到並選中"<*> USB Mass Storage support",
(3)另外,現在的優盤等移動存儲器使用的大都是 FAT/FAT32格式的,因此我們還需要添加 FAT32 文件系統的支持,在內核配置主菜單下依次選擇如下菜單項:
File systems --->
DOS/FAT/NT Filesystems --->
進入 FAT32 文件系統配置子菜單,並選擇MSDOS fs support
(4)除此之外,爲了支持中英文的編碼,在"File systems"菜單下選擇"-*- Native language support --->"並進入在這裏,我們要選擇如下幾個編碼的支持:
Codepage 437 (United States, Canada)
NLS ISO 8859-1 (Latin 1; Western European Languages)
NLS UTF-8
退出保存以上配置。
1.4.3 測試優盤
接上面的步驟,在內核源代碼根目錄下執行:make zImage,把生成的新內核燒寫到開發板中,先不要插入優盤(這樣做是爲了看插入時的打印信息),等系統啓動後,進入命令行控制檯,此時優盤已經被自動掛載到開發板的/udisk 目錄。
說明:在 Qtopia中支持優盤自動掛載是通過友善之臂開發的一個 Qtopia 2.2.0插件實現的,目前它只識別 MMC/SD 卡或優盤的第一個分區,並且格式爲常見的 VFAT/FAT32/FAT16,如果你的優盤或者 SD卡不能識別,請檢查是否爲 VFAT/FAT32/FAT16 格式。
1.5 移植 SD卡驅動
1.5.1 在內核中註冊 SD設備驅動
Linux-2.6.32.2 已經自帶了 S3C2440芯片的 SD 卡驅動,我們只需在初始化代碼中加入SD平臺設備結構就可以,打arch/arm/mach-s3c2440/mach-mini2440.c,在 nand flash平臺結
構後面添加如下紅色代碼:
;在 mini2440.c的頂部添加 SD 卡設備結構所需的頭文件
#include <linux/mmc/host.h>
#include <plat/mci.h>
static struct platform_device mini2440_device_eth = {
.name = "dm9000",
.id = -1,
.num_resources = ARRAY_SIZE(mini2440_dm9k_resource),
.resource = mini2440_dm9k_resource,
.dev = {
.platform_data = &mini2440_dm9k_pdata,
};
},
/* MMC/SD */
// mini2440_mmc_cfg在初始化函數裏面
static struct s3c24xx_mci_pdata mini2440_mmc_cfg = {
.gpio_detect = S3C2410_GPG(8),
.gpio_wprotect = S3C2410_GPH(8),
.set_power = NULL,
.ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34,
};
並把 SD 卡結構設備添加到目標平臺設備集中,如圖:
static struct platform_device *mini2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_rtc,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&mini2440_device_eth,
&s3c24xx_uda134x,
&s3c_device_nand,
&s3c_device_sdi,
};
SD 卡的驅動程序底層操作實際對應源代碼 linux-2.6.32.2/drivers/mmc/host/s3cmci.c,
根據測試,當包含內核打印信息時,SD 卡可以被正常識別使用,而沒有打印信息時,則表現的不太穩定,因此我們在該程序中添加了一句延時代碼,如圖:
;延時函數所需的頭文件
#include <linux/delay.h>
static void pio_tasklet(unsigned long data)
{
struct s3cmci_host *host = (struct s3cmci_host *) data;
s3cmci_disable_irq(host, true);
udelay(50); //在此處添加了延時函數
if (host->pio_active == XFER_WRITE)
do_pio_write(host);
注意:還要在mach-mini2440.c中的初始化函數裏面加入SD信息。
static void __init mini2440_machine_init(void)
{
s3c24xx_fb_set_platdata(&mini2440_fb_info);
s3c_i2c0_set_platdata(NULL);
s3c_device_nand.dev.platform_data = &mini2440_nand_info;
s3c_device_sdi.dev.platform_data = &mini2440_mmc_cfg;
platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));
//smdk_machine_init();
}
這樣,我們就完成了 SD 卡驅動的初步移植。
注意:添加完這些之後SD卡能自動掛載了,但是還是不能正常的讀寫。
1.5.2 測試 SD卡
接上面的步驟,在內核源代碼目錄執行:make zImage,把生成的內核燒寫到開發板中,先不要插入 SD卡(這樣做是爲了看插入時的打印信息),等系統啓動後,進入命令行控制檯此時 SD卡已經被自動掛載到開發板的/sdcard 目錄。
說明:支持 SD卡或者優盤自動掛載是通過友善之臂開發的一個 Qtopia 2.2.0插件實現的,目前它只識別 MMC/SD 卡或優盤的第一個分區,並且格式爲常見的VFAT/FAT32/FAT16,如果你的優盤或者 SD卡不能識別,請檢查是否爲 VFAT/FAT32/FAT16 格式。
1.5.3 mini2440 的 SD卡驅動分析(來自網絡)
原文出處:
http://www.arm9home.net/read.php?tid-2570.html