讲解之前我得说一下,现在有一个新的技术在公司已经在用了,远远比你在学校学的东西要先进一点,我们烧写u-boot程序一般是在flash上,然后由flash中的程序来引导linux内核,但是flash成本远远比SD卡要高,现在公司很多都用SD卡来代替flash,这个具体怎么实现,还得自己去学习,我目前也不是很熟悉这个新的技术,就不写出来了,等我熟悉以后再写出来分享吧。
Linux中对S3C2440 SD驱动已经支持的非常好。为了让FL2440支持2G以上的SD卡,只需要完成几个步骤即可。
Linux2.6.30.9内核源码中S3C2440 CPU的SD卡控制器驱动对应的源码文件为 s3cmci.c 存放在\drivers\mmc\host目录下。 SD驱动的源码在平台设备驱动架构,移植步骤如下:
这里我得强调一下这个内核版本更新是很快的,所以些地方有可能是不一样的,但是思路是不变得。
1. 在内核中注册SD卡平台设备。通过修改mach-smdk2440.c 文件来实现。在mach-smdk2440.c文件的smdk2440_devices数组中增加s3c_device_sdi 平台设备成员,如下所示:
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
......
&lys3c2440_device_st16c554,
&s3c_device_sdi, //增加SD卡平台设备结构体,也就是硬件部分相关的代码,如果你学过platform总线框架,这里就非常好理解了。
};
s3c_device_sdi平台设备定义在devs.c文件中,如下所示:/* 这里已经定义好了,就不需要我们在去定义了 */
struct platform_device s3c_device_sdi = {
.name = "s3c2410-sdi",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_sdi_resource),
.resource = s3c_sdi_resource,
};
/* 第二部很重要了,这里就得去分析你的SD卡函数接口,如果你用的内核默认的接口就不用修改了,一般也是默认的接口,只有极个别的开发板是用的其他接口,这个可以参考芯片手册 */
2. 修改s3cmci.c, 设置检测SD卡插入的中断号,及配置响应的引脚为中断功能。如下所示:修改s3cmci_probe函数,将
host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect);
修改为:
host->irq_cd = IRQ_EINT18;
s3c2410_gpio_cfgpin(S3C2410_GPG10,S3C2410_GPG10_EINT18);
设置检测SD插入的中断号为外部中断18,这时是根据FL2440的原理图来确定的。FL2440 SD卡接口的原理图如下所示:
NCD PIN脚是用于检测SD卡插入的引脚,由图可以看出 NCD接的是 EINT18 号外部中断。
3. 添加MMC内核配置选项
在内核的MMC配置选项中添加对S3C SD/MMC的支持,如下图所示:
4. 在内核中取消所有分区类型
取消内核中的所有分区,如下所示:
进行以上修改后,重新编译zImage ,这样这个zImage就支持 SD卡驱动了。
/* zImage很少使用了,一般都用u Image,这里还是可以实现动态加载驱动,不编译进内核,这就根据自己的项目来确定了,为了节省成本,获得高效率,没用到的程序坚决不编译进内核*/
/* 新内核版本已经不需要了 */
5. 创建 SD卡分区设备文件节点,如下所示:
mknod /dev/mmcblk0p1 b 179 1 /* 手动创建设备节点,也可以在程序写给类,利用mdev机制自动创建设备节点 */
6. 挂载文件系统,命令如下:
mount /dev/mmcblk0p1 /mnt
这样我们就可以使用SD卡了。