Linux驱动之挂在SD卡

      讲解之前我得说一下,现在有一个新的技术在公司已经在用了,远远比你在学校学的东西要先进一点,我们烧写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卡了。

 

 

时间: 2024-11-01 18:23:18

Linux驱动之挂在SD卡的相关文章

Samsung_tiny4412(驱动笔记01)----linux 3.5,U-Boot,Busybox,SD卡启动环境搭建

/*********************************************************************************** * * linux 3.5,U-Boot,Busybox,SD卡启动环境搭建 * * 声明: * 1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会 * 不对齐,从而影响阅读. * 2. 以下所有的shell命令都是在root权限下运行的; * 3. minicom(U-Boot)指的是用minico

Linux驱动之挂接U盘

当我们做实际项目开发式,有时候我不可能把很大的数据直接放在flash上,很多时候多事放在U盘或者SD卡,这里我们讲解怎么让Linux系统支持挂机U盘. 这个U盘代码Linux内核是自带的,我们直接编译,具体怎么编译请接着往下看. 在内核根目录下执行make menuconfig命令,然后: 方法一:直接编译进内核       Device Drivers  --->       [*] USB support  --->                  <*>   USB Mas

arm-linux下以太网如何访问SD卡并读取数据,求大神指导

问题描述 linux下以太网如何访问SD卡并读取数据,求大神指导 我用的arm926,在linux下想实现通过以太网访问SD卡数据,并存储,没接触过所以不了解,求大神帮帮小弟 解决方案 必须在SD卡的机器上开服务,比如FTP,目前FTP有现成的程序,将工作目录设置为SD卡然后连上FTP就可以访问了

《树莓派实战秘籍》——1.2 技巧02挂载SD卡

1.2 技巧02挂载SD卡 树莓派实战秘籍 你当然可以直接从正在运行的树莓派上访问其文件,但使用SD卡读卡器将SD卡挂载到一台独立的计算机上,将会使很多任务(如添加或编辑文件)变得更容易. 虽然树莓派就是一台独立的Linux计算机,不过如果你手头有另外一台计算机的话确实可以为你提供帮助,在有的情况下,它甚至可能是不可或缺的.幸运的是,现在许多计算机都带有内置的SD卡读卡器,即使你的计算机没有内置,它们的价格也不贵并且很容易买到.所以,即使你买的是预装系统的SD卡,你也应该拥有一个SD卡读卡器以及

android内核-如何控制一个内核驱动,待SD卡或内部存储设备加载完毕后再运行?

问题描述 如何控制一个内核驱动,待SD卡或内部存储设备加载完毕后再运行? 在做一个Android内核驱动程序,主要功能是读取一个存储在SD卡或内部存储比如NAND中的一个文本文件,然后解析该文件来设置一些参数. 先编译成模块,用insmod加载,rmmod来卸载,经过调试一切功能都搞定了.然后,把模块编译进了内核,也能正常加载,但是文件打开失败,看了一下内核启动log,发现由于驱动运行时文件系统还没有加载SD卡和NAND,自然无法打开文件.所以很想知道,遇到这类情况如何解决? 解决方案 建议你多

新工具利用SD卡槽将iPhone挂在iMac的旁边

还记得"X档案"里那个家伙自己变成可分身的双胞胎的情节吗?你想把你的iPhone挂在http://www.aliyun.com/zixun/aggregation/19416.html">iMac的旁边吗?现在Sideburn可以帮你实现这个愿望.虽然iPhone是一个非常考究的设备,但它仍然需要借助其他方式放入一个SD卡插槽.这是其中Sideburn的用武之地. 这个铝材质的底座和iPhone 外观很相配,可以插入到iMac或MacBook上的SD插槽,让你在方便的地

zynq7015-zynq 7015 开发板从SD卡启动Linux,出现错误

问题描述 zynq 7015 开发板从SD卡启动Linux,出现错误 reading system.bit.bin时出现错误

《树莓派学习指南(基于Linux)》——1.4 将Raspbian烧录到SD卡

1.4 将Raspbian烧录到SD卡 树莓派学习指南(基于Linux) 将Raspbian烧录到SD卡与简单的文件复制稍有不同.我们下载的镜像文件是一份完整的SD卡内容克隆.为了完成烧录的工作,我们需要使用前面提到的一些工具. 注意 你所下载的SD卡镜像文件被打包在一个zip压缩包里.在Windows 7下,双击即可以文件夹的形式打开zip压缩包.将SD卡镜像文件复制到自己的文件夹下以备使用.在Mac OS X下,双击zip压缩包后SD卡镜像文件将会自动被解压缩到"下载"(Downl

arm Linux 如何自动检测并mount SD卡,以及如何得知已经mount

一.土八路做法: SD 卡一旦插入系统,内核会自动在/dev/下创建设备文件:sdcard. 但有时可能时用户在拨出卡前并没有umount的话,第二次插卡进去后系统创建的就不是sdcard设备文件了,而是mmcblk0, mmcblk1p1, mmcblk2p1, 或mmcblk3p1. 所以只需用if ( fopen("/dev/sdcard", "r") == NULL ) 来检测SD卡是否已经被内核捉到.然后就可以mount ....以及你想干的事情了. 如何