日期:2014-05-16  浏览次数:20667 次

linux-2.6.32在mini2440开发板上移植(12)之SD卡驱动移植

编者:这个驱动还是比较复杂的,先移植着,以后在分析吧。

SD卡驱动移植

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 */
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);
这样,我们就完成了SD 卡驱动的移植。

 

2 测试SD 卡
       接上面的步骤,在内核源代码目录执行:make zImage,把生成的内核烧写到开发板中,先不要插入SD 卡(这样做是为了看插入时的打印信息),等系统启动后,进入命令行控制台,此时插入SD 卡,
此时SD 卡已经被自动挂载到开发板的/sdcard 目录,同时,在Qtopia 系统中,可以看到任务栏上多了一个图标,如图SD 卡或者优盘中的所有文件会在“文档”组中全部显示出来,但它是不显示目录名称的,如果你的文件太多,那么其列表也是相当可观的。
      说明:支持SD 卡或者优盘自动挂载是通过友善之臂开发的一个Qtopia 2.2.0 插件实现的,目前它只识别MMC/SD 卡或优盘的第一个分区,并且格式为常见的VFAT/FAT32/FAT16,如果你的优盘或者SD 卡不能识别,请检查是否为VFAT/FAT32/FAT16 格式。