linux系统下M.2硬盘调试和测试全指南:从初始化失败到读写满速,避坑就看这篇

电子说

1.4w人已加入

描述

 

 

在嵌入式开发中,M.2 接口的 NVMe 硬盘凭借高速读写和小巧体积,成了 RK(瑞芯微)等平台的 性能担当。但调试时总绕不开几个坑:主机初始化失败、硬盘挂载不上、测试后重启翻车……

 

 

今天结合实际项目文档,从调试(硬件 配置)” 到 测试(挂载 读写),手把手教你搞定 M.2 硬盘,附带避坑要点,新手也能少走弯路。

 

 

一、调试篇:先解决认得到,再谈 用得好

 

M.2 硬盘(NVMe 协议)依赖 PCIe 链路通信,调试的核心是 PCIe 链路通、电源稳、配置对。最常见的问题是主机初始化失败,先从这入手。

 

 

1. 硬件先查:电源 时钟是 生命线

Linux系统

 

 

M.2 硬盘要工作,首先得有稳定的电源和时钟,这一步别光看原理图,要结合实际测量:

 

 

电源:VCC3V3_PCIE30 必须到位

 

 

原理图中 M.2 的供电依赖VCC3V3_PCIE30(文档 2 原理图标注),实际调试时要确认两点:

 

 

① 电源芯片输出是否稳定(用万用表测电压,需在 3.25~3.35V 之间);

 

 

② 电源使能 GPIO 是否正常(文档 中用gpio4 RK_PB2控制,通过/sys/kernel/debug/gpio查看状态):

 

 

查看GPIO电平,确认电源使能(gpio-138对应vcc3v3-ssdout hi表示已使能)

 

 

cat /sys/kernel/debug/gpio | grep vcc3v3-ssd

 

 

若显示out lo,说明电源没打开,需检查 DTS 中电源 regulator 配置(下文会讲)。

 

 

时钟:PCIE_CLKREQn 引脚别浮空

 

 

M.2 的 PCIe 时钟需要PCIE_CLKREQn引脚(文档 2 中是pcie20x1_0_clkreqn_m1,对应gpio4 RK_PB4)控制,该引脚负责请求时钟输出:

 

 

① 原理图中时钟路径需无虚焊(比如 HCSL 差分线阻抗匹配);

 

 

② DTS 中引脚配置要符合硬件(文档 中是&pcfg_pull_none,若之前遇到过不稳定,可参考历史经验改为&pcfg_pull_down)。

 

 

2. DTS 配置:个关键节点不能错

 

RK 平台的 M.2 硬盘(NVMe)依赖 PCIe 控制器和 PHY 配置,DTS 中这 个节点必须写对,少一个都可能初始化失败:

 

 

1PCIe PHY 配置:指定工作模式

 

&pcie30phy节点控制 PCIe PHY 的工作模式,M.2 NVMe 通常用 聚合模式AGGREGATION):

 

 

&pcie30phy {

 

 

    rockchip,pcie30-phymode = ; // 聚合模式,适配NVMe

 

 

    status = "okay"; // 启用PHY

 

 

};

 

 

2PCIe 控制器配置:电源 复位 引脚

 

&pcie3x4 PCIe 控制器节点,需关联电源供应、复位 GPIO 和时钟引脚:

 

 

&pcie3x4 {

 

 

    reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>; // 复位GPIO,高电平有效

 

 

    vpcie3v3-supply = <&vcc3v3_pcie30>; // 关联PCIe 3.3V电源

 

 

    pinctrl-names = "default";

 

 

    pinctrl-0 = <&pcie20x1_0_clkreqn_m1>; // 关联时钟请求引脚

 

 

    status = "okay"; // 启用控制器

 

 

};

 

 

重点:vpcie3v3-supply必须指向正确的电源 regulator(下文节点),否则控制器没电,直接初始化失败。

 

 

3)电源 Regulator:确保稳定供电

 

单独配置 M.2 硬盘的电源 regulator,加入延迟避免上电冲击:

 

 

pcie20_vcc3v3_ssd_4G: vcc3v3-ssd{

 

 

    compatible = "regulator-fixed"; // 固定电压调节器

 

 

    gpio = <&gpio4 RK_PB2 GPIO_ACTIVE_HIGH>; // 电源使能GPIO

 

 

    pinctrl-names = "default";

 

 

    pinctrl-0 = <&pcie20_3v3_drv_4G>; // 电源使能引脚配置

 

 

    regulator-name = "pcie20_3v3_ssd"; // 电源名称,与控制器对应

 

 

    enable-active-high; // 高电平使能电源

 

 

    start-delays-us = <5000>; // 启动延迟5ms,避免冲击

 

 

    off-on-delay-us = <5000>; // 切换延迟5ms

 

 

    regulator-always-on; // 始终供电,避免休眠断电

 

 

    regulator-boot-on; // 启动阶段即供电,保证初始化

 

 

};

 

 

3. 排查:主机初始化失败?两步定位

Linux系统

 


 

若开机后dmesg看不到 NVMe 设备,提示 主机初始化失败,按这两步查:

 

 

第一步:看 PCIe 链路是否 “Link up”

 

通过dmesg查看 PCIe 控制器日志,核心看 “LTSSM 状态PCIe 链路训练状态机):

 

 

过滤PCIe控制器日志(以fe150000.pcie为例,根据实际地址修改)

 

 

dmesg | grep fe150000

 

 

成功标志:日志中出现PCIe Link up, LTSSM is 0x230011(如文档 2 中的成功日志),说明 PCIe 链路已建立;

 

 

失败标志:若 LTSSM 停在0x30x210022,说明链路没训练成功,回头查硬件(电源、时钟引脚虚焊)。

 

 

第二步:查电源 GPIO 是否正常

 

如前文所述,通过/sys/kernel/debug/gpio查看电源使能 GPIO(比如gpio-138):

 

 

若显示out lo:检查 DTS regulator节点的enable-active-high是否配置正确,或 GPIO 引脚复用冲突;

 

 

若电压正常但 GPIO 无输出:排查 GPIO 引脚是否被其他驱动占用(用cat /sys/kernel/debug/pinctrl/pinctrl-soc/registered-pins查看)。

 

 

二、测试篇:三步走,测性能还不翻车

 

搞定初始化后,下一步是测试硬盘的挂载和读写性能,但要注意:测试会损坏硬盘格式,必须按流程来

 

 

1. 第一步:挂载硬盘,先确保 挂得上

 

M.2 NVMe 硬盘在 Linux 下识别为/dev/nvme0n1(若多个则为 nvme0n2 等),挂载分 临时挂载” 和 开机自动挂载

 

 

临时挂载:快速测试

 

# 1. 创建挂载点(比如/mnt/ssd

 

 

mkdir /mnt/ssd

 

 

# 2. 挂载ext4格式的硬盘(若未格式化,先执行mkfs.ext4 /dev/nvme0n1

 

 

mount -t ext4 /dev/nvme0n1 /mnt/ssd

 

 

# 3. 检查是否挂载成功(看/dev/nvme0n1是否在列表中)

 

 

df -h

 

 

成功示例:文档 2 df -h显示/dev/nvme0n1  469G  28K  445G  1% /mnt/ssd,说明挂载正常。

 

 

开机自动挂载:避免每次手动操作

 

临时挂载重启后失效,通过/etc/fstab配置自动挂载:

 

 

# 1. 先检查/dev/nvme0n1UUID(避免设备名变动导致挂载失败)

 

 

blkid /dev/nvme0n1

 

 

# 2. 将挂载信息写入/etc/fstab(示例,UUID需替换为实际值)

 

 

echo 'UUID=xxxx-xxxx  /mnt/ssd  ext4  defaults   0' | sudo tee -a /etc/fstab

 

 

# 3. 测试自动挂载(无需重启)

 

 

sudo mount -a

 

 

# 4. 验证:再次用df -h查看,确认已挂载

 

 

避坑:不要直接写/dev/nvme0n1,用 UUID 更稳定(设备名可能因插其他硬盘变动)。

 

 

2. 第二步:用 dd 测读写速率,看性能达标没

 

M.2 硬盘的核心优势是速度,用dd指令测试读写速率(文档 1 中的核心指令),注意指令含义和参数:

 

 

测试读取速率

 

# if=输入文件(从硬盘读),of=输出文件(丢弃到/dev/null),bs=块大小1MBcount=1024次(共1GB

 

 

dd if=/dev/nvme0n1 of=/dev/null bs=1M count=1024

 

 

文档 2 中实际结果:1073741824字节已复制, 0.535s, 2.0 GB/s,说明读取速率达标(PCIe 3.0×4 的理论上限是 4GB/s,实际因损耗在 2GB/s 左右正常)。

 

 

测试写入速率

 

# if=输入文件(从/dev/zero读零数据),of=输出文件(写入硬盘),conv=fdatasync(强制同步到硬件,避免缓存干扰)

 

 

dd if=/dev/zero of=/dev/nvme0n1 bs=1M count=1024 conv=fdatasync

 

 

文档 2 中实际结果:1073741824字节已复制, 0.944s, 1.1 GB/s,写入速率略低是正常现象(NVMe 硬盘通常读快于写)。

 

 

3. 关键一步:测试后必须格式化,否则重启 翻车

 

重点提醒:上述dd指令会直接读写硬盘原始扇区,导致 ext4 格式损坏 —— 若不重新格式化,下次重启会 找不到硬盘

 

 

正确流程:测试后立即卸载并重新格式化:

 

 

# 1. 先卸载挂载点(必须先卸载,否则无法格式化)

 

 

umount /mnt/ssd

 

 

# 2. 重新格式化为ext4格式(注意:会清除所有数据,测试后执行)

 

 

mkfs.ext4 /dev/nvme0n1

 

 

# 3. 格式化后重新挂载,确保正常使用

 

 

mount /mnt/ssd

 

 

避坑:若忘记格式化,重启后df -h看不到硬盘,需重新执行上述指令修复。

 

 

三、避坑总结:个关键要点记牢

 

1.DTS 配置:电源 时钟别漏配

 

 

控制器节点(&pcie3x4)必须关联vpcie3v3-supply,否则没电;

 

 

时钟请求引脚(pcie20x1_0_clkreqn_m1)拉取状态要匹配硬件,不稳定就改下拉。

 

 

1.测试后:格式化是保命步骤

 

 

dd指令直接操作原始扇区,不格式化会破坏文件系统,重启必翻车;

 

 

格式化前务必umount,否则会提示设备忙

 

 

1.排查时:先看链路和 GPIO

 

 

初始化失败先查dmesg PCIe Link 是否 up

 

 

电源问题直接看/sys/kernel/debug/gpio,比测电压更高效。

 

 

结尾

 

M.2 硬盘调试看似复杂,实则围绕 电源稳、链路通、配置对、测试规范” 这几个核心。你在调试时遇到过 挂载后掉盘”“速率不达标” 这类问题吗?欢迎在评论区分享你的踩坑经历,一起交流解决!


 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分