ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

RK3566平台TF卡SDR104模式调优实战:从设备树到信号完整性

RK3566平台TF卡SDR104模式调优实战:从设备树到信号完整性 前段时间在RK3566平台上调一块安卓工控板TF卡插上去死活跑不到UHS SDR104模式要么只能在High Speed模式下工作要么读着读着就掉卡。换了好几张不同品牌的卡都一样一度怀疑是主控虚焊后来从设备树到内核驱动再到PCB layout一步步排查总算是把这个SDR104模式彻底吃透了。今天把整个调优过程整理出来包括模式原理、设备树配置、驱动层采样时钟调节和硬件信号完整性的经验给以后做RK3566或者类似瑞芯微平台的兄弟一个参考。这篇文章适合正在做RK3566/RK3568安卓或Linux方案的软硬件工程师也适合那些只是想把TF卡读写稳定性调好的朋友。文章不会把SDR104讲成玄学而是从原理到实操把每一步怎么查、怎么改、为什么这么改都掰开揉碎讲清楚。1. 先搞懂SDR104为什么它快又为什么难调1.1 UHS-I速度体系中SDR104的位置在调优之前得先把SD卡的速度体系理清楚。SD卡从早期的Default SpeedDS一路演进到如今的UHS-II、SD Express但我们日常用的TF卡90%以上还是UHS-I。UHS是Ultra High Speed的缩写UHS-I定义了五种工作模式SDR12、SDR25、SDR50、SDR104和DDR50。这里面的含义是这样的SDR12对应12.5MB/s的理论带宽SDR25对应25MB/sSDR50对应50MB/s而SDR104就是UHS-I里的天花板理论带宽104MB/s工作时钟最高可以到208MHz。DDR50虽然也是50MB/s但它用的是双沿采样实际开发中应用不算多。SDR104这个“104”就是104MB/s的意思还有一层含义是时钟从最初的25MHz一路拉高到了208MHz翻了8倍多。需要注意的是SDR104要求主机控制器和TF卡双方都支持缺一不可。很多廉价TF卡虽然打着UHS-I的标但实际只支持到SDR50甚至SDR25插上去协商模式的时候就会自动降级。所以在调优之前第一件事就是确认手里的测试卡真的支持SDR104而且最好是两张不同主控方案的卡交叉验证。RK3566主控里的SDMMC控制器是基于Synopsys DesignWare Mobile Storage Host架构的这颗控制器本身是支持SDR104的驱动上用的也是Linux内核标准的dw_mmc-rockchip驱动。既然主控和驱动都支持那为什么实际跑起来就是不稳这就涉及到200MHz高频信号带来的实际问题了。1.2 SDR104模式下的三大不稳定因素第一个不稳定因素是信号完整性。HS模式下时钟只有50MHz信号边沿稍微差点也能凑合识别到了SDR104模式时钟频率拉到208MHz一个时钟周期只有4.8ns左右信号上升沿、下降沿哪怕出现几百ps的畸变都可能造成数据采样点偏移。再加上TF卡是可插拔结构卡座弹片和卡金手指之间的接触电阻、接触电感在高频下都会被放大稍微有点脏污或者弹片老化信号质量就会急剧恶化。第二个不稳定因素是采样窗口变窄。SD卡读数据时主控需要在一个稳定的时间窗口内采样数据线上的电平。频率越高这个窗口越窄。SDR104模式下数据有效窗口可能只有1到2ns这就要求主控的采样时序必须精确。如果采样点偏了轻则偶发读错误重则直接掉卡。这就是为什么SDR104模式需要做tuning调优的原因通过扫描不同采样相位找到最稳定的那个点。第三个因素是电压切换。UHS-I模式要求信号电平从传统的3.3V切换到1.8V。初始识别卡的时候用3.3V识别出卡支持UHS-I之后主控会发CMD11命令然后把vqmmc电源轨切到1.8V再重新初始化进入高速模式。这个切换过程如果vqmmc电源设计不当、电平跌落太慢或者纹波太大卡就会协商失败直接回退到High Speed模式。这也是很多板子SDR104跑不起来的最隐蔽原因之一。2. 硬件与设备树把前置条件配齐2.1 RK3566的SDMMC控制器资源概述RK3566这颗芯片在存储接口上可以说相当齐全内置了多个SD/MMC控制器。一般来说SDMMC0会用来接TF卡SDMMC1或SDMMC2可能接SDIO WiFi模块另外还有独立的EMMC控制器接板载eMMC。在开始调优之前先确认你改的是哪个控制器节点别稀里糊涂把SDIO的配置改了那样WiFi会先挂掉。每个SDMMC控制器都有两路时钟biu总线接口单元时钟和ciu卡接口单元时钟。ciu时钟就是直接送给TF卡的工作时钟SDR104模式下需要跑到200MHz左右。RK3566的时钟树里SDMMC控制器可以通过时钟分频和相位配置来调整输出时钟的频率和相位这就是后面软件调优的基础。硬件上还要注意IO域电压SDMMC控制器的IO电平由vccio_sd供电决定这颗电源必须支持3.3V和1.8V动态切换UHS-I模式才能工作。有些方案图省事直接固定1.8V或者固定3.3V供电那SDR104基本就别想了。2.2 设备树关键配置项逐条拆解设备树配置是整个调优的地基。下面是一份常见的RK3566 TF卡节点配置我把关键属性拆开讲清楚sdmmc0 { status okay; bus-width 4; cap-sd-highspeed; sd-uhs-sdr104; max-frequency 200000000; vmmc-supply vcc3v3_sd; vqmmc-supply vcc_1v8_sd; pinctrl-0 sdmmc0_bus4 sdmmc0_clk sdmmc0_cmd sdmmc0_det; cd-gpios gpio0 RK_PA4 GPIO_ACTIVE_LOW; disable-wp; rockchip,default-sample-phase 90; };先看bus-widthTF卡数据总线是4bit这里必须写4。然后是cap-sd-highspeed和sd-uhs-sdr104这两个属性告诉内核主控支持High Speed模式和SDR104模式。有人会问只写了sdr104SDR50还用配吗不用mmc core会自动协商SDR50和SDR25属于UHS-I的必选模式只要支持SDR104自然向下兼容。max-frequency是整个调优里最容易出问题的属性。有些平台的默认值只有150MHz虽然SDR104模式下实际频率会在150MHz和200MHz之间协商但如果你发现卡一直跑在150MHz而没法到200MHz先看一眼这个值是不是被限制了。vmmc-supply是卡的主电源一般3.3Vvqmmc-supply是IO电平电源必须支持3.3V/1.8V切换。这里要重点确认vqmmc对应的regulator驱动有没有实现set_voltage回调如果regulator不支持动态调压那电压切换命令就会失败卡会被死死按在High Speed模式。rockchip,default-sample-phase是瑞芯微驱动特有的采样相位配置后面的数值是相位角度单位是度。这个值直接影响数据采样的时间点是SDR104调优的核心参数后面的实测部分我会详细讲。2.3 配置不当时的现象与日志特征设备树配置不当会导致各种诡异现象我把常见的几种现象和对应的日志特征列出来方便大家排查时对照第一种是卡只能跑High Speed日志里会看到mmc0: new high speed SDXC card然后速度怎么都上不去。这种情况优先查vqmmc的regulator配置和UHS相关的cap属性。第二种是卡能枚举到SDR104模式但一旦开始大量读写就报错日志里反复出现mmc0: error -110 whilst reading或者mmc0: tuning execution failed。这种多半是采样相位不对或者信号完整性太差。第三种是电压切换阶段直接卡死日志停在mmc0: mmc_select_hs200或者发送CMD11之后没有响应这种要重点检查vqmmc电源的带载能力和电平切换时序。还有一个小细节部分RK3566平台SDMMC0的卡检测脚不是默认的配置cd-gpios时一定要对照原理图确认GPIO号和有效电平不然可能出现卡插上没反应、或者一直认为有卡的假象。3. 从软件到硬件的SDR104调优实操3.1 驱动层采样时钟与tuning调优SDR104的本质问题就是时序而时序的核心是采样点。Linux内核的mmc子系统在进入UHS-I模式之后会执行一个叫tuning的流程主控向TF卡发送一系列的tuning block数据同时不断调整采样相位找出误码率最低的相位点。瑞芯微的dw_mmc-rockchip驱动在这个基础上做了一些增强采样相位的调节范围通常是0到360度驱动会把整个周期分成若干步进逐个扫描。扫描完成后驱动会把最优相位记录下来。这里就引出了rockchip,default-sample-phase的作用它是在tuning开始之前就设定好的初始采样相位。如果tuning因为某些原因失败或者被跳过驱动就会退回使用这个默认值。实际调试中我习惯先把rockchip,default-sample-phase设成一个经验值比如90然后启动系统通过debugfs接口查看当前的工作状态cat /sys/kernel/debug/mmc0/ios这个文件里能看到当前时钟频率、总线宽度、时序模式等信息。如果显示timing spec: 11 (SD UHS SDR104)说明已经进入了SDR104模式。接下来用fio或者dd做读写压力测试观察是否稳定。如果测试不稳定我就开始尝试不同的采样相位值。这个方法比较土但在实际项目里非常有效每次修改设备树里的rockchip,default-sample-phase重新编译并烧录boot分区然后跑一轮读写测试记录结果。我调试的一块板子从60度到150度各跑了一轮最终稳定区间锁定在90度到120度之间最后的量产配置取的是105度保证余量充足。3.2 PCB布局与信号完整性调整软件调优只能解决部分问题如果硬件设计本身就不过关软件再怎么调都是治标不治本。我在这块RK3566板子上排查时发现最初PCB layout里TF卡座的CLK走线绕了一个大圈长度比CMD长了将近30mm这种长度不匹配在200MHz下就是致命的。SD卡的关键信号一共6根CLK、CMD、DAT0到DAT3。layout上要求这6根线尽量等长误差控制在1mm以内CLK线尤其要短最好放在中间不要跨层。阻抗控制在50欧姆左右串阻22欧姆到33欧姆放在主控端可以有效抑制振铃。CMD和DAT线上的上拉电阻选10k到47k上拉到对应的IO电压域。还有一个容易被忽略的点是卡座。TF卡座虽然看起来都差不多但弹片的材质、夹紧力、以及是否有金属外壳接地在高频下的表现差别很大。我后来把板子上的推拉式卡座换成了带金属屏蔽罩的型号掉卡问题立刻少了很多。如果你在产品设计阶段建议直接用质量好的带壳卡座别在这上面省钱。供电设计也要注意vmmc稳压器要靠近卡座放置输出电容至少10uF以上保证卡在高速读写瞬间电流波动时电压不掉坑。vqmmc的切换速度同样重要最好选用软启动的LDO或者DCDC避免切换瞬间出现尖峰。3.3 一次完整的调优实测记录下面是我在一块RK3566工控板上做的一次完整调优记录供大家参考。测试环境是RK3566安卓12系统内核版本5.10测试卡是一张128GB UHS-I U3规格的TF卡。默认配置是rockchip,default-sample-phase 60开机后系统日志显示成功进入SDR104模式频率200MHz。然后我用下面这条命令做读取测试dd if/dev/mmcblk0p1 of/dev/null bs1M count512第一次测出来平均读取速度75MB/s看起来还凑合但紧接着用fio做4K随机读压力测试时跑了一分钟就报错掉卡。日志里出现了tuning execution failed。这说明60度这个采样相位有问题。我把sample-phase改成90度重新编译kernel并烧录。再次开机同样的测试流程读取速度提升到了88MB/s4K随机读连续跑了10分钟没有报错。又试了120度读取速度85MB/s但再用另一张64GB的卡交叉测试时出现了偶发读错误。最终我把相位设为105度也就是90度和120度之间的中间值两张测试卡都通过了连续12小时的读写压力测试。各相位点的测试结果整理如下sample-phase读取速度稳定性结论60度75MB/s4K随机读1分钟掉卡不可用90度88MB/s10分钟压力测试稳定可用105度87MB/s12小时双卡交叉稳定量产选用120度85MB/s另一张卡偶发读错误边缘150度80MB/s出现卡死不可用从这次实测能很直观地看到采样相位不是越大越好也不是某个固定值通吃所有板子。每块板的走线长度、卡座型号、甚至测试卡本身都会影响最优相位点所以调优必须基于实际测试数据不能靠猜。4. 常见问题排查与量产经验4.1 高频问题速查表我在多个RK3566平台上折腾TF卡积累了下面这张速查表基本涵盖了常见问题现象可能原因排查方向一直只能跑High Speedvqmmc不支持1.8V切换检查regulator配置和硬件电路进入SDR104但频繁掉卡采样相位偏重新扫描sample-phase电压切换阶段卡死vqmmc电源纹波大调整电源电容和切换时序读卡速度只有20MB/sSD卡本身是低速卡换支持UHS-I的高速卡测试偶发读错误但不掉卡信号完整性问题检查走线等长和串阻匹配换卡后性能差异巨大主控兼容性问题更新内核驱动并重新tuning插卡没反应卡检测脚配置错误核对cd-gpios和有效电平高低温测试时掉卡温度影响时序双极限温度下重新扫描相位这些问题的共通点是不要一上来就怀疑主控或者卡先在硬件和配置上做排除法。SD卡本身就是消耗品不同批次、不同主控方案的卡对时序的敏感度差异很大你测出来最优的相位值换一批卡可能就要微调所以量产前一定要做卡兼容性矩阵测试。4.2 调试工具与避坑心得调SDR104模式离不开日志我强烈建议在调试阶段通过CH340等USB转串口工具把内核串口日志导出来方便实时观察SD卡枚举、tuning和报错信息。RK3566平台的调试串口默认在UART2上波特率1500000接上CH340之后在电脑上打开串口终端就能看到完整的mmc相关日志。调试中还要注意一点不要直接对正在使用的根文件系统分区做写压力测试很容易把系统写挂。我一般是把TF卡格式化出一个独立分区挂载到/mnt/sdcard在这个分区上做读写测试。测试完直接重新格式化方便又安全。再说一个很多人不知道的小技巧RK3566的maskrom模式配合TF卡可以做系统救砖。如果boot分区写坏了无法启动可以用RKDevTool擦除Flash再通过TF卡引导进入loader模式刷回系统。这种场景下TF卡虽然工作在默认低速模式但稳定性同样重要。谁能想到救砖救到一半TF卡因为高速模式时序问题导致数据校验失败那才是真叫天天不应。4.3 从调优到量产验证清单与设计规范调优的最终目的是让产品稳定量产所以验证工作不能只做一轮。我整理了一份比较完整的验证清单给大家参考第一卡兼容性矩阵。至少准备5个品牌、5种容量、两种速率等级U1和U3的TF卡分别在常温、高温、低温三个温度点做读写压力测试。每个温度点连续跑12小时记录掉卡率、读写速度和报错日志。第二量产抽检流程。批量生产的板子不可能每台都做12小时老化测试但至少要抽3%到5%的板子跑一轮短时间的SDR104读写验证确保焊接和物料批次没有引入新的问题。我见过一批板子换了卡座供应商后SDR104全部不稳定所以物料变更必须重新验证。第三设计规范沉淀。TF卡相关设计建议写进公司硬件设计规范包括走线等长要求、串阻阻值、卡座选型、vmmc和vqmmc的电源要求。下次再开新的RK3566或者RK3568项目直接按规范设计能省掉大量调优时间。软件层面同样要形成配置基线。每个项目验证通过的那组rockchip,default-sample-phase值记得同步到内核dts的公共配置里并做好版本注释。如果后续要升级内核版本一定要重新验证tuning行为因为内核mmc子系统在升级时可能会调整默认策略之前稳定的配置在新内核上未必稳定。最后说一个我在好几个项目里反复碰到的点SDR104的调优不是改一个参数就完事它涉及到主控、TF卡、PCB设计和驱动四方的协同。你换一张卡可能同样的相位值表现就完全不同你改了一版PCB走线长度变了之前调好的值大概率要重调。所以一定要把硬件设计做扎实然后再用软件去弥补剩余的误差而不是指望软件去拯救一套稀烂的layout。我个人的习惯是每次拿到新板子先把SDR104相关的硬件设计评审一遍确认供电、走线、卡座都没有明显问题再开始软件调优。这一步排除了大量干扰项后面调相位的时候心里才有底。如果你正在被TF卡SDR104不稳定折磨按照这篇文章的顺序从硬件到软件逐步排查大概率能在一天之内把问题定位并解决。
返回列表