[Linux]学习笔记系列 -- [drivers][mmc]mmc_sd

📅 发布时间:2026/7/9 21:34:09 👁️ 浏览次数:
[Linux]学习笔记系列 -- [drivers][mmc]mmc_sd
title: mmc_sdcategories:linuxdriversmmcabbrlink: 64b4b0cfdate: 2026-01-16 14:55:15tags:linuxdriversmmchttps://github.com/wdfk-prog/linux-study文章目录drivers/mmc/core/sd_ops.cdrivers/mmc/core/sd_uhs2.c SD UHS-II总线管理(SD UHS-II Bus Management) 实现UHS-II卡初始化与信号调整历史与背景这项技术是为了解决什么特定问题而诞生的它的发展经历了哪些重要的里程碑或版本迭代目前该技术的社区活跃度和主流应用情况如何核心原理与设计它的核心工作原理是什么它的主要优势体现在哪些方面它存在哪些已知的劣势、局限性或在特定场景下的不适用性使用场景在哪些具体的业务或技术场景下它是首选解决方案是否有不推荐使用该技术的场景为什么对比分析请将其 与 其他相似技术 进行详细对比。drivers/mmc/core/sd_ops.cintmmc_send_ext_addr(structmmc_host*host,u32 addr){structmmc_commandcmd{.opcodeSD_ADDR_EXT,.argaddr,.flagsMMC_RSP_R1|MMC_CMD_AC,};if(!mmc_card_ult_capacity(host-card))return0;returnmmc_wait_for_cmd(host,cmd,0);}drivers/mmc/core/sd_uhs2.c SD UHS-II总线管理(SD UHS-II Bus Management) 实现UHS-II卡初始化与信号调整历史与背景这项技术是为了解决什么特定问题而诞生的这项技术是为了支持SD UHS-IIUltra High Speed II存储卡标准而诞生的。随着专业相机4K/8K视频录制、RAW格式高速连拍和高性能计算设备对存储速度要求的不断提升传统的SD/UHS-I总线最高104 MB/s已成为严重的性能瓶颈。UHS-II标准的出现旨在解决此问题它引入了一套全新的物理接口和协议以实现更高的数据传输速率。drivers/mmc/core/sd_uhs2.c文件中的代码专门用于解决支持UHS-II所带来的新挑战全新的物理接口UHS-II卡在传统SD卡引脚的基础上增加了第二排引脚用于低电压差分信号LVDS以实现数百MB/s的高速传输。内核需要新的逻辑来管理和切换到这个新接口。复杂的初始化序列与传统SD卡简单的命令响应初始化方式不同UHS-II卡的发现和初始化需要一个独特的、基于特定信号模式的握手过程。专用寄存器访问UHS-II卡的功能、速度模式和配置信息存储在一组扩展功能寄存器中访问这些寄存器需要一套特殊的命令序列。信号训练Training在如此高的频率下工作为了保证信号的完整性和可靠的数据传输主机控制器必须在切换到高速模式之前执行一个“训练”或“调谐Tuning”过程以校准时钟和数据信号的相位。它的发展经历了哪些重要的里程碑或版本迭代UHS-II标准本身是SD卡协会发布的一个重大技术飞跃。在Linux内核中对其支持是逐步演进的初期内核的MMC/SD子系统只能将UHS-II卡识别为普通的UHS-I或更低速的卡并以降级模式运行。引入专有逻辑为了支持UHS-II的原生高速模式社区将与UHS-II相关的、高度专业化的代码从通用的SD卡处理逻辑sd.c中分离出来创建了sd_uhs2.c。这一步是关键的里程碑它实现了UHS-II卡的发现、握手和初始化流程。完善与优化后续的版本迭代主要集中在修复特定主机控制器或UHS-II卡上的兼容性问题优化训练序列的可靠性以及添加对UHS-III等更新标准的支持如果它们共享相似的机制。目前该技术的社区活跃度和主流应用情况如何sd_uhs2.c是Linux内核MMC子系统中的一个核心且稳定的部分由该子系统的维护者持续维护。这项技术是任何需要支持UHS-II高速读写的现代Linux系统的必备功能。主流应用广泛应用于带有高性能SD读卡器的高端笔记本电脑、USB外置读卡器、以及需要高速数据采集的嵌入式系统例如专业无人机、高端便携式录音设备等。核心原理与设计它的核心工作原理是什么sd_uhs2.c中的代码并不在内核启动时独立运行而是在通用的SD卡初始化流程中当检测到可能是UHS-II卡时被调用。其工作流程如下发现Discovery在标准的SD卡初始化流程中位于sd.c当主机发送ACMD41后UHS-II卡会通过保持CMD和DAT0-3线路为高电平来发出一个特殊信号。MMC核心检测到这个信号后会中止传统流程转而调用sd_uhs2_start_discovery()函数。握手与初始化该函数会请求底层的主机控制器驱动执行UHS-II的物理层发现序列。这是一个精确的时序操作成功后卡和主机就建立了一个基本的LVDS通信链路。读取扩展寄存器一旦链路建立sd_uhs2.c中的代码如sd_uhs2_read_ext_regs会使用UHS-II专用的命令来读取卡的扩展功能寄存器。这些寄存器描述了卡支持的速度模式、总线宽度Lane数、全双工/半双工能力等关键信息。模式选择驱动会比较主机和卡共同支持的最佳模式并通过sd_uhs2_write_ext_regs将选择的模式例如FD156 - 全双工156MB/s写入卡的寄存器中。训练Training在正式切换到所选的高速模式之前必须执行信号训练。sd_uhs2_execute_tuning()函数会请求主机控制器进入训练模式硬件会发送特定的数据模式并根据接收到的响应来调整内部的采样点以确保数据能被无误地读取。切换总线模式训练成功后驱动会最后一次配置主机控制器使其正式进入UHS-II LVDS模式进行数据传输。至此sd_uhs2.c的任务完成后续的数据传输由MMC核心和主机控制器驱动接管。它的主要优势体现在哪些方面极致性能解锁了UHS-II卡的全部性能潜力使数据传输速率从UHS-I的约100MB/s提升至300MB/s甚至更高。模块化设计将复杂的UHS-II专用逻辑封装在一个独立的文件中避免了对通用SD/MMC代码的侵入使得代码结构更清晰更易于维护。遵循标准严格按照SD卡协会发布的官方规范实现保证了与标准UHS-II卡和主机的兼容性。它存在哪些已知的劣势、局限性或在特定场景下的不适用性高度依赖主机驱动sd_uhs2.c本身只实现了协议层的逻辑。所有关键操作如发现序列、训练最终都必须由底层的主机控制器驱动程序来实现。如果主机驱动没有实现UHS-II所需的回调函数或者实现有误那么UHS-II模式将无法启用。调试困难UHS-II的初始化过程涉及物理层的精确信号时序一旦出现问题如训练失败很难单纯通过软件日志来判断是卡的问题、主机的问题还是电路板信号完整性的问题。物理层敏感由于工作频率极高UHS-II对PCB板的布线质量和信号完整性要求非常苛刻硬件设计上的瑕疵很容易导致软件层面上的功能不稳定。使用场景在哪些具体的业务或技术场景下它是首选解决方案这是支持UHS-II原生速度的唯一标准解决方案。专业媒体工作站用于为摄影师、摄像师和视频剪辑师提供服务的Linux工作站或笔记本电脑需要快速地从UHS-II卡中导入大量的RAW照片和高码率视频素材。高性能外置读卡器基于Linux的嵌入式系统例如一个通过USB-C连接的高速多功能读卡器需要使用此驱动来支持UHS-II卡。数据记录设备在科学研究或工业监控领域需要将高速传感器数据实时写入可移动存储介质的设备。是否有不推荐使用该技术的场景为什么不存在不推荐使用该技术的场景只有硬件不支持的场景。如果一个系统的硬件主机控制器和卡槽支持UHS-II那么启用sd_uhs2.c中的逻辑是发挥硬件性能的必要条件。如果硬件不支持那么这部分代码自然不会被执行系统会自动回退到UHS-I或更旧的模式。对比分析请将其 与 其他相似技术 进行详细对比。最直接的对比对象是传统的SD/UHS-I协议其逻辑主要实现在drivers/mmc/core/sd.c中。特性SD UHS-II (sd_uhs2.c驱动)传统 SD / UHS-I (sd.c驱动)物理接口两排引脚使用低电压差分信号(LVDS)进行高速传输。单排引脚使用单端CMOS信号。初始化方式复杂的物理层握手和发现序列访问专用的UHS-II寄存器。基于命令-响应的协议访问标准的SD卡寄存器(CSD, CID等)。总线模式全双工或半双工使用1或2对差分信号线(Lane)。仅半双工使用1位或4位数据线。信号训练强制要求在进入高速模式前必须执行复杂的训练序列。对SDR104等高速模式推荐执行但过程相对简单(使用CMD19)。理论最高速率FD312模式下可达312 MB/s。SDR104模式下最高104 MB/s。实现复杂性高。协议层和物理层的交互非常紧密对主机驱动要求高。中等。是经过多年发展的成熟技术逻辑相对直接。向后兼容性完全兼容。UHS-II卡和主机可以无缝回退到UHS-I或更低模式运行。N/A