Linux kernel eMMC 驱动分析

一、硬件结构和协议

eMMC 是一种存储芯片,它将 nand flash 和 eMMC 控制器封装在一块 BGA 芯片上。

【硬件连接图】

gpio_cd ?

协议相关可以参考下方文档。

分区说明:

eMMC 分区管理 · Linux Kernel Internals (codingbelief.com)

二、eMMC 驱动框架

eMMC 驱动代码路径(core,card,host):drivers/mmc/

这个路径下有三个文件 (不同 kernel 版本会有差异,总体结构大致一样),对应三层框架:

1.card/ --> 将 eMMC/SD 实现为块设备。向文件系统层、用户空间提供文件操作的接口,主要文件是 card/ 录下的 block.c,queue.c 向它提供了几个函数来操作队列块设备的驱动程序。

2.core/ --> 核心代码层,这部分完成了MMC/SD命令的封装,不同协议和规范(MMC/SD)的实现,为 host 层的驱动提供接口函数,它也调用主机控制器层的接口完成存储卡的识别、设置、读写等;

3.host/ --> 主机控制器驱动 (通讯接口),对接硬件,需要根据自己的芯片修改。

【框架具体介绍】

【框图】

三、主机控制器驱动分析(drivers/mmc/host/pxamic.c)

linux kernel 使用 struct mmc_host 来描述一个 emmc 主机控制器。从驱动代码中看到它最终会被注册成一个 platform 设备。

代码大致流程如下

1、调用 mmc_alloc_host,分配一个struct mmc_host 类型的变量,描述某一个具体的 MMC host 控制器。

2、根据 MMC host 控制器的硬件特性,填充 struct mmc_host 变量的各个字段,例如 MMC 类型、电压范围、操作函数集等等。

3、调用 mmc_add_host 接口,将正确填充的 mmc_host 注册到 MMC core 中。

mmc_host 结构体介绍  原型文件:include/linux/mmc/host.h 

这个结构体用来描述一个 eMMC 主机控制器,里面包含了硬件相关的一系列的参数,宏还有操

方法。其中比较重要的成员:

1.struct mmc_card,表示连接到 mmc_host 的 mmc device,原型文件 : include/linux/mmc/card.h


2.struct mmc_host_ops *ops,定义本mmc_host的操作接口(包括与mmc card通信的接口 request、卡检测相关的接口等);

struct mmc_host_ops {   -----------------非常重要  

    int (*enable)(struct mmc_host *host);   //使能和禁止HOST控制器  
    int (*disable)(struct mmc_host *host);  // 非必要实现

    void    (*request)(struct mmc_host *host, struct mmc_request *req); // 核心函数,用于SD卡命令和数据的传输,比如发送和接收命令,CMD0,CMD8,ACMD41诸如此类的都是在这个函数去实现。

    void    (*set_ios)(struct mmc_host *host, struct mmc_ios *ios); // 配置时钟、总线、电源、片选、时序等   
    int (*get_ro)(struct mmc_host *host);   //用于检测SD卡的写保护是否打开     
    int (*get_cd)(struct mmc_host *host);   //用于SD卡的检测,是否有卡插入和弹出  
    void    (*enable_sdio_irq)(struct mmc_host *host, int enable);  //开启sdio中断  
    ...  
}

-----------------------  

struct mmc_request ,封装了一次传输请求, 读写MMC卡的请求包括命令,数据以及请求完成后的回调函数。

原型文件:include/linux/mmc/core.h 

struct mmc_request {  
    struct mmc_command  *sbc;       /* SET_BLOCK_COUNT for multiblock */  
    struct mmc_command  *cmd;  /*读写的命令相关信息,48bit*/
    struct mmc_data  *data;  /*MMC卡读写的数据相关信息如:请求,操作命令,数据以及状态等*/
    struct mmc_command  *stop;  

    struct completion   completion;  
    void  (*done)(struct mmc_request *);   /* 完成后的回调,通知请求者*/
    struct mmc_host     *host;  
};  

-------------------------

mmc_ios 结构体,描述 mmc bus 的配置,set_ios 函数

struct mmc_ios {

}

eMMC 数据和命令的读写,都是通过上面的回调函数

void (*request)(struct mmc_host *host, struct mmc_request *req);

函数的实现会去使用 DMA 直接进行存储器访问,具体方法可参考如下链接

应读者要求讲讲 DMA_布道师Peter的博客-CSDN博客


3

struct delayed_work     detect;

int detect_change;  /* card detect flag */

四、工作流程

【流程框图】

初始化

读流程

写流程

五、参考连接

sd 卡驱动--基于高通平台_mb61b9894206fca的技术博客_51CTO博客

LINUX MMC子系统分析之四 MMC host模块概述_jerry_chg的博客-CSDN博客_mmc_host

linux emmc子系统,Linux eMMC子系统之主机控制器驱动_P大点S的博客-CSDN博客

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux emmc驱动是用于控制嵌入式多媒体卡(eMMC)的驱动程序。eMMC是一种集成了闪存和控制器的存储设备,广泛用于嵌入式系统中。Linux emmc驱动可以让操作系统与eMMC设备进行通信,实现数据的读写和管理。它是Linux内核的一部分,可以通过内核配置或模块加载来启用。 ### 回答2: Linux emmc驱动Linux操作系统中用于与嵌入式多媒体卡(emmc)设备进行通信的模块。嵌入式多媒体卡是一种内置的非易失性存储计算机芯片,通常用于移动设备、嵌入式系统和其他低功耗设备中。Linux emmc驱动通过底层操作系统调用和emmc芯片提供的接口,实现与设备的通信和数据传输。 Linux emmc驱动支持多种不同类型的emmc设备,包括存储容量不同、电源和时钟设置不同的设备。驱动还支持设备的多种访问模式,包括读、写、擦除和调整大小等。此外,驱动还提供了对emmc设备中特殊特征(如坏块)的识别和处理能力。 Linux emmc驱动通常和Linux内核一起提供。在使用emmc设备时,用户必须正确地配置和编译内核,并将驱动模块添加到系统中。然后,用户可以使用标准Linux命令行工具(如dd命令)来访问emmc设备,或者在操作系统中编写应用程序来实现高级功能。 总的来说,Linux emmc驱动是一种重要的系统组件,用于在Linux操作系统中与嵌入式多媒体卡设备进行通信和数据传输。它提供了对多种不同类型和访问模式的支持,并且具有对特殊特征的识别和处理能力,为嵌入式和移动设备的应用程序提供了重要支持。 ### 回答3: Linux emmc驱动是用于控制和管理emmc存储设备的软件程序,它负责管理emmc的读写操作,包括芯片选择、寄存器设置、数据传输等。emmc是一种嵌入式多媒体卡,它包括一个闪存控制器和闪存芯片,通常用于嵌入式系统中。 Linux操作系统支持emmc存储设备,因此需要相应的驱动程序来管理这些设备。Linux emmc驱动是用C语言编写的模块,它包含一系列函数和数据结构,用于控制和管理emmc存储设备。驱动程序将emmc设备映射到系统上,并将读写操作转换成相应的指令发送给emmc控制器。 Linux emmc驱动是一个较为复杂的驱动程序,需要具有丰富的经验和技能才能正确编写和调试。其中最重要的部分是驱动程序的接口和数据结构定义。驱动程序需要定义一些数据结构,如超时时间、命令类型、数据类型等,以及一些特定的寄存器和寄存器位控制宏。 在编写和调试Linux emmc驱动时,需要考虑多种因素,如设备的信号传递、芯片选中、芯片操作和寄存器设置等。此外,还需要考虑调试和测试驱动程序的方法和工具,以确保驱动程序的正确性和稳定性。 总之,Linux emmc驱动是控制和管理emmc存储设备的核心程序,它是基于Linux内核模块编写的,需要在编写和调试时考虑多种因素,以确保驱动程序的正确性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值