【实验目的】
SD卡是嵌入式系统中最常用到的外部存储单元,现在的手机,相机等等消费电子及其它设备都在使用SD卡来弥补系统本身存储较小的缺点.这里我们在我们的系统中也添加SD卡的功能.
【实验环境】
1、 Ubuntu 10.10发行版
2、 u-boot-2010.03
3、 FS2410平台
4、 交叉编译器 arm-none-linux-gnueabi-gcc-4.3.2
【实验步骤】
1、 配置内核
Device Drivers --->
<*> MMC/SD/SDIO card support --->
<*> MMC block device Drivers
<*> Samsung S3C SD/MMC Card Interface support
2、 修改平台代码
修改arch/arm/mach-s3c2410/mach-smdk2410.c 添加如下内容:
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_ohci,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_sdi, //添加内容
&s3c_device_adc,
&s3c_device_ts,
};
3、 添加SD卡热插拔功能
按照上面两个步骤就能够是我们的SD卡正常工作了,只是不能实现热插拔的功能,必须在系统启动的时候就把卡插上,这样才能是SD卡正常的工作,否则就无法识别SD卡.
查看FS2410原理图,发现SD卡的nCS_SD脚接在GPG10上,这个管脚用来监测SD卡插拔,于是我们添加如下代码
修改arch/arm/mach-s3c2410/mach-smdk2410.c 添加如下内容:
#include <mach/gpio.h>
#include <linux/mmc/host.h>
#include <plat/mci.h>
/*SDI Support*/
static struct s3c24xx_mci_pdata smdk2410_mmc_cfg __initdata = {
.gpio_detect = S3C2410_GPG(10),
.set_power = NULL,
.ocr_avail = MMC_VDD_32_33,
};
在smdk2410_init中添加
s3c24xx_mci_set_platdata(&smdk2410_mmc_cfg);
4、 重新编译内核
$ make zImage
5、 拷贝内核到tftpboot目录下
$ cp arch/arm/boot/zImage /tftpboot
6、 启动系统后插上SD卡
s3c-sdi s3c2410-sdi: running at 0kHz (requested: 0kHz).
s3c-sdi s3c2410-sdi: running at 396kHz (requested: 400kHz).
s3c-sdi s3c2410-sdi: running at 396kHz (requested: 400kHz).
s3c-sdi s3c2410-sdi: running at 396kHz (requested: 400kHz).
s3c-sdi s3c2410-sdi: running at 396kHz (requested: 400kHz).
s3c-sdi s3c2410-sdi: running at 396kHz (requested: 400kHz).
s3c-sdi s3c2410-sdi: running at 396kHz (requested: 400kHz).
s3c-sdi s3c2410-sdi: running at 396kHz (requested: 400kHz).
s3c-sdi s3c2410-sdi: running at 12675kHz (requested: 25000kHz).
s3c-sdi s3c2410-sdi: running at 12675kHz (requested: 25000kHz).
mmc0: new SDHC card at address aaaa
mmcblk0: mmc0:aaaa SD04G 3.69 GiB
mmcblk0: p1
这说明我们有一个4G的SD卡被发现了,它有一个分区
7、 创建设备节点
# mknod mmcblk0p1 b 179 1
8、 挂载SD卡
# mount -t vfat /dev/mmcblkp1 /mnt
9、 查看SD卡内容
# ls /mnt