详解linux 驱动编写(sd卡驱动)

随着sd卡的流行,sd卡在嵌入式设备上使用的场景也越来越多。那下面我们可以看一下,linux驱动框架上是怎么处理sd卡驱动的?

1、代码目录地址

drivers/mmc 

2、基本结构

从mmc的代码结构可以看得出,主要分为两个部分,其中core为协议部分,host为各个soc的适配部分

host是我们需要真正关心的代码

3、以s3c为例,观察makefile

obj-$(CONFIG_MMC_SDHCI_S3C) += sdhci-s3c.o
......
obj-$(CONFIG_MMC_S3C)    += s3cmci.o 

4、根据s3c阅读Kconfig,确认s3c下的sd卡还依赖哪些文件

config MMC_SDHCI_S3C
  tristate "SDHCI support on Samsung S3C SoC"
  depends on MMC_SDHCI && PLAT_SAMSUNG
  help
   This selects the Secure Digital Host Controller Interface (SDHCI)
   often referrered to as the HSMMC block in some of the Samsung S3C
   range of SoC. 

   If you have a controller with this interface, say Y or M here. 

   If unsure, say N. 

config MMC_SDHCI_S3C_DMA
  bool "DMA support on S3C SDHCI"
  depends on MMC_SDHCI_S3C
  help
   Enable DMA support on the Samsung S3C SDHCI glue. The DMA
   has proved to be problematic if the controller encounters
   certain errors, and thus should be treated with care. 

   YMMV. 

config MMC_S3C
  tristate "Samsung S3C SD/MMC Card Interface support"
  depends on ARCH_S3C24XX
  depends on S3C24XX_DMAC
  help
   This selects a driver for the MCI interface found in
     Samsung's S3C2410, S3C2412, S3C2440, S3C2442 CPUs.
   If you have a board based on one of those and a MMC/SD
   slot, say Y or M here. 

   If unsure, say N.

5、MMC_S3C和MMC_SDHCI_S3C是主要的macro,接着了解两个macro对应文件的数据结构

首先看一下s3cmci.c文件,

static const struct mmc_host_ops s3cmci_ops = {
  .request  = s3cmci_request,
  .set_ios  = s3cmci_set_ios,
  .get_ro   = mmc_gpio_get_ro,
  .get_cd   = mmc_gpio_get_cd,
  .enable_sdio_irq = s3cmci_enable_sdio_irq,
}; 

再看一下sdhci-s3c.c文件,

static struct sdhci_ops sdhci_s3c_ops = {
  .get_max_clock   = sdhci_s3c_get_max_clk,
  .set_clock   = sdhci_s3c_set_clock,
  .get_min_clock   = sdhci_s3c_get_min_clock,
  .set_bus_width   = sdhci_set_bus_width,
  .reset     = sdhci_reset,
  .set_uhs_signaling = sdhci_set_uhs_signaling,
}; 

6 、从host角度来说,有了platform driver和上面的host driver,驱动流程就算搞清楚了。

但是如果深入下去的话,还是需要好好读一下sd协议,这里面花的时间最多。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Linux下如何安装Run文件格式NVIDIA显卡驱动
  • 如何编写Linux设备驱动程序
  • Linux内核模块和驱动的编写
  • Linux 字符设备驱动框架详细介绍
  • linux 驱动编写之虚拟字符设备的编写实例详解
  • linux 驱动之Kconfig文件和Makefile文件实例
  • linux 触摸屏驱动编写
  • 详解linux lcd驱动编写
  • 详解linux pwm驱动编写
  • 详解linux dma驱动编写
(0)

相关推荐

  • linux 驱动编写之虚拟字符设备的编写实例详解

     linux 驱动编写 前言: 昨天我们说了一些简单模块编写方法,但是终归没有涉及到设备的编写内容,今天我们就可以了解一下相关方面的内容,并且用一个实例来说明在Linux上面设备是如何编写的.虽然我不是专门做linux驱动的,却也经常收到一些朋友们的来信.在信件中,很多做驱动的朋友对自己的工作不是很满意,认为自己的工作就是把代码拷贝来拷贝去,或者说是改来改去,没有什么技术含量.有这种想法的朋友不在少数,我想这主要还是因为他们对自己的工作缺少了解导致.如果有可能,我们可以问问自己这样几个问题: (

  • 详解linux pwm驱动编写

    pwm方波可以用来控制很多的设备,比如它可以被用来控制电机.简单来说,就是单位时间内的方波越多,那么电机的转速就会越快:反之就越慢.通过这个特性,soc就可以轻松地利用pwm对外设进行自动控制.所以,今天的主题就是pwm驱动. 1.驱动目录 drivers/pwm 2.查看对应目录下的Kconfig config PWM_SAMSUNG tristate "Samsung PWM support" depends on PLAT_SAMSUNG || ARCH_EXYNOS help

  • Linux下如何安装Run文件格式NVIDIA显卡驱动

    本文给大家介绍的非常详细,具体详情请看下文吧. 开始安装首先修改/etc/inittab文件将: id:5:initdefault: 改为: id:3:initdefault: #vi /etc/inittab 然后重启电脑 系统进入字符模式并用root登录,随后运行NVIDIA-linux-x86-1.0-5336-pkg1.run # sh NVIDIA-linux-x86-1.0-5336-pkg1.run 然后根据提示作出选择,安装大概用时5分钟. 接着修改XF86Config文件把Dr

  • linux 驱动之Kconfig文件和Makefile文件实例

    linux 驱动之Kconfig文件和Makefile文件实例 在Linux编写驱动的过程中,有两个文件是我们必须要了解和知晓的.这其中,一个是Kconfig文件,另外一个是Makefile文件.如果大家比较熟悉的话,那么肯定对内核编译需要的.config文件不陌生,在.config文件中,我们发现有的模块被编译进了内核,有的只是生成了一个module.这中间,我们如何让内核发现我们编写的模块呢,这就需要在Kconfig中进行说明.至于如何生成模块,那么就需要利用Makefile告诉编译器,怎么

  • linux 触摸屏驱动编写

    早在诺基亚手机还比较流行的时候,那时候触摸屏用的还不多.但是随着触摸屏手机.即智能手机的流行,触摸屏基本成了手机的标配.所以,今天可以看看触摸屏驱动在linux上是如何进行的. 1.驱动目录 drivers/input 2.看看这个目录的Makefile如何设计 obj-$(CONFIG_INPUT) += input-core.o input-core-y := input.o input-compat.o input-mt.o ff-core.o obj-$(CONFIG_INPUT_TOU

  • Linux内核模块和驱动的编写

    Linux内核是一个整体是结构,因此向内核添加任何东西,或者删除某些功能,都十分困难.为了解决这个问题引入了内核机制.从而可以动态的想内核中添加或者删除模块. 模块不被编译在内核中,因而控制了内核的大小.然而模块一旦被插入内核,他就和内核其他部分一样.这样一来就会曾家一部分系统开销.同时,如果模块出现问题,也许会带来系统的崩溃. 模块的实现机制: 启动时,由函数 void inti_modules() 来初始化模块,因为启动事很多时候没有模块.这个函数往往把内核自身当作一个虚模块. 如由系统需要

  • 详解linux dma驱动编写

    linux下面的驱动虽然什么样的情形都有,但是dma驱动却并不少见.dma可以有很多的好处,其中最重要的功能就是能够帮助我们将数据搬来搬去,这个时候cpu就由时间去做别的事情了,提高了设备效率. 1.dma驱动在什么地方 drivers/dma 2.如何看s3c的dma驱动,先看Kconfig config S3C24XX_DMAC bool "Samsung S3C24XX DMA support" depends on ARCH_S3C24XX || COMPILE_TEST se

  • Linux 字符设备驱动框架详细介绍

    Linux 字符设备驱动框架 字符设备是Linux三大设备之一(另外两种是块设备,网络设备),字符设备就是字节流形式通讯的I/O设备,绝大部分设备都是字符设备,常见的字符设备包括鼠标.键盘.显示器.串口等等,当我们执行ls -l /dev的时候,就能看到大量的设备文件,c就是字符设备,b就是块设备,网络设备没有对应的设备文件.编写一个外部模块的字符设备驱动,除了要实现编写一个模块所需要的代码之外,还需要编写作为一个字符设备的代码. 驱动模型 Linux一切皆文件,那么作为一个设备文件,它的操作方

  • 详解linux lcd驱动编写

    有些嵌入式设备是不需要lcd的,比如路由器.但是,还有些设备是需要lcd显示内容的,比如游戏机.测试仪.智能手表等等.所以,今天我们就看看lcd驱动在linux上是怎么进行的. 1.代码目录 drivers/video 2.查看video下的Makefile文件 # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_VGASTATE) += vgastate.o obj-$(CONFIG_HDMI) += hdmi.o obj-$(CONFIG_VT)

  • 如何编写Linux设备驱动程序

    Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它dos或window环境下的驱动程序有很大的区别.在Linux环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kernel中的函数,有些常用的操作要自己来编写,而且调试也不方便.本人这几周来为实验室自行研制的一块多媒体卡编制了驱动程序,获得了一些经验,愿与Linux fans共享,有不当之处,请予指正. 以下的一些文字主要来源于khg,johnsonm的W

随机推荐