在嵌入式開發(fā)中,M.2接口的NVMe硬盤憑借高速讀寫和小巧體積,成了RK(瑞芯微)等平臺的“性能擔當”。但調試時總繞不開幾個坑:主機初始化失敗、硬盤掛載不上、測試后重啟翻車……
今天結合實際項目文檔,從“調試(硬件+配置)”到“測試(掛載+讀寫)”,手把手教你搞定M.2硬盤,附帶避坑要點,新手也能少走彎路。
一、調試篇:先解決“認得到”,再談“用得好”
M.2硬盤(NVMe協(xié)議)依賴PCIe鏈路通信,調試的核心是讓PCIe鏈路通、電源穩(wěn)、配置對。最常見的問題是“主機初始化失敗”,先從這入手。
1.硬件先查:電源+時鐘是“生命線”

M.2硬盤要工作,首先得有穩(wěn)定的電源和時鐘,這一步別光看原理圖,要結合實際測量:
?電源:VCC3V3_PCIE30必須到位
原理圖中M.2的供電依賴VCC3V3_PCIE30(文檔2原理圖標注),實際調試時要確認兩點:
①電源芯片輸出是否穩(wěn)定(用萬用表測電壓,需在3.25~3.35V之間);
②電源使能GPIO是否正常(文檔2中用gpio4 RK_PB2控制,通過/sys/kernel/debug/gpio查看狀態(tài)):
|
#查看GPIO電平,確認電源使能(gpio-138對應vcc3v3-ssd,out 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中引腳配置要符合硬件(文檔2中是&pcfg_pull_none,若之前遇到過不穩(wěn)定,可參考歷史經驗改為&pcfg_pull_down)。
2. DTS配置:3個關鍵節(jié)點不能錯
RK平臺的M.2硬盤(NVMe)依賴PCIe控制器和PHY配置,DTS中這3個節(jié)點必須寫對,少一個都可能初始化失敗:
(1)PCIe PHY配置:指定工作模式
&pcie30phy節(jié)點控制PCIe PHY的工作模式,M.2 NVMe通常用“聚合模式”(AGGREGATION):
|
&pcie30phy {
rockchip,pcie30-phymode =
status = "okay"; //啟用PHY
};
|
(2)PCIe控制器配置:電源+復位+引腳
&pcie3x4是PCIe控制器節(jié)點,需關聯(lián)電源供應、復位GPIO和時鐘引腳:
|
&pcie3x4 {
reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>; //復位GPIO,高電平有效
vpcie3v3-supply = <&vcc3v3_pcie30>; //關聯(lián)PCIe 3.3V電源
pinctrl-names = "default";
pinctrl-0 = <&pcie20x1_0_clkreqn_m1>; //關聯(lián)時鐘請求引腳
status = "okay"; //啟用控制器
};
|
?重點:vpcie3v3-supply必須指向正確的電源regulator(下文節(jié)點),否則控制器沒電,直接初始化失敗。
(3)電源Regulator:確保穩(wěn)定供電
單獨配置M.2硬盤的電源regulator,加入延遲避免上電沖擊:
|
pcie20_vcc3v3_ssd_4G: vcc3v3-ssd{
compatible = "regulator-fixed"; //固定電壓調節(jié)器
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.排查:主機初始化失敗?兩步定位

若開機后dmesg看不到NVMe設備,提示“主機初始化失敗”,按這兩步查:
第一步:看PCIe鏈路是否“Link up”
通過dmesg查看PCIe控制器日志,核心看“LTSSM狀態(tài)”(PCIe鏈路訓練狀態(tài)機):
|
#過濾PCIe控制器日志(以fe150000.pcie為例,根據(jù)實際地址修改)
dmesg | grep fe150000
|
?成功標志:日志中出現(xiàn)PCIe Link up, LTSSM is 0x230011(如文檔2中的成功日志),說明PCIe鏈路已建立;
?失敗標志:若LTSSM停在0x3或0x210022,說明鏈路沒訓練成功,回頭查硬件(電源、時鐘引腳虛焊)。
第二步:查電源GPIO是否正常
如前文所述,通過/sys/kernel/debug/gpio查看電源使能GPIO(比如gpio-138):
?若顯示out lo:檢查DTS中regulator節(jié)點的enable-active-high是否配置正確,或GPIO引腳復用沖突;
?若電壓正常但GPIO無輸出:排查GPIO引腳是否被其他驅動占用(用cat /sys/kernel/debug/pinctrl/pinctrl-soc/registered-pins查看)。
二、測試篇:三步走,測性能還不翻車
搞定初始化后,下一步是測試硬盤的掛載和讀寫性能,但要注意:測試會損壞硬盤格式,必須按流程來。
1.第一步:掛載硬盤,先確保“掛得上”
M.2 NVMe硬盤在Linux下識別為/dev/nvme0n1(若多個則為nvme0n2等),掛載分“臨時掛載”和“開機自動掛載”:
臨時掛載:快速測試
|
# 1.創(chuàng)建掛載點(比如/mnt/ssd)
mkdir /mnt/ssd
# 2.掛載ext4格式的硬盤(若未格式化,先執(zhí)行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/nvme0n1的UUID(避免設備名變動導致掛載失敗)
blkid /dev/nvme0n1
# 2.將掛載信息寫入/etc/fstab(示例,UUID需替換為實際值)
echo 'UUID=xxxx-xxxx/mnt/ssdext4defaults00' | sudo tee -a /etc/fstab
# 3.測試自動掛載(無需重啟)
sudo mount -a
# 4.驗證:再次用df -h查看,確認已掛載
|
?避坑:不要直接寫/dev/nvme0n1,用UUID更穩(wěn)定(設備名可能因插其他硬盤變動)。
2.第二步:用dd測讀寫速率,看性能達標沒
M.2硬盤的核心優(yōu)勢是速度,用dd指令測試讀寫速率(文檔1中的核心指令),注意指令含義和參數(shù):
測試讀取速率
|
# if=輸入文件(從硬盤讀),of=輸出文件(丟棄到/dev/null),bs=塊大小1MB,count=1024次(共1GB)
dd if=/dev/nvme0n1 of=/dev/null bs=1M count=1024
|
?文檔2中實際結果:1073741824字節(jié)已復制, 0.535s, 2.0 GB/s,說明讀取速率達標(PCIe 3.0×4的理論上限是4GB/s,實際因損耗在2GB/s左右正常)。
測試寫入速率
|
# if=輸入文件(從/dev/zero讀零數(shù)據(jù)),of=輸出文件(寫入硬盤),conv=fdatasync(強制同步到硬件,避免緩存干擾)
dd if=/dev/zero of=/dev/nvme0n1 bs=1M count=1024 conv=fdatasync
|
?文檔2中實際結果:1073741824字節(jié)已復制, 0.944s, 1.1 GB/s,寫入速率略低是正常現(xiàn)象(NVMe硬盤通常讀快于寫)。
3.關鍵一步:測試后必須格式化,否則重啟“翻車”
重點提醒:上述dd指令會直接讀寫硬盤原始扇區(qū),導致ext4格式損壞——若不重新格式化,下次重啟會“找不到硬盤”!
正確流程:測試后立即卸載并重新格式化:
|
# 1.先卸載掛載點(必須先卸載,否則無法格式化)
umount /mnt/ssd
# 2.重新格式化為ext4格式(注意:會清除所有數(shù)據(jù),測試后執(zhí)行)
mkfs.ext4 /dev/nvme0n1
# 3.格式化后重新掛載,確保正常使用
mount /mnt/ssd
|
?避坑:若忘記格式化,重啟后df -h看不到硬盤,需重新執(zhí)行上述指令修復。
三、避坑總結:3個關鍵要點記牢
1.DTS配置:電源+時鐘別漏配
?控制器節(jié)點(&pcie3x4)必須關聯(lián)vpcie3v3-supply,否則沒電;
?時鐘請求引腳(pcie20x1_0_clkreqn_m1)拉取狀態(tài)要匹配硬件,不穩(wěn)定就改下拉。
1.測試后:格式化是“保命步驟”
?dd指令直接操作原始扇區(qū),不格式化會破壞文件系統(tǒng),重啟必翻車;
?格式化前務必umount,否則會提示“設備忙”。
1.排查時:先看鏈路和GPIO
?初始化失敗先查dmesg看PCIe Link是否up;
?電源問題直接看/sys/kernel/debug/gpio,比測電壓更高效。
結尾
M.2硬盤調試看似復雜,實則圍繞“電源穩(wěn)、鏈路通、配置對、測試規(guī)范”這幾個核心。你在調試時遇到過“掛載后掉盤”“速率不達標”這類問題嗎?歡迎在評論區(qū)分享你的踩坑經歷,一起交流解決!
-
嵌入式
+關注
關注
5198文章
20442瀏覽量
333963 -
硬盤
+關注
關注
3文章
1361瀏覽量
59874 -
Linux系統(tǒng)
+關注
關注
4文章
614瀏覽量
29901
發(fā)布評論請先 登錄
串口通信基石:Air8000下Modbus RTU串口初始化詳解!
將1YN M.2與COOLDIM_PRG_BOARD NUCLEO-H753ZI結合使用,初始化Wi-Fi失敗的原因?
M.2固態(tài)硬盤無法識別的兩個原因和解決方法
BPI啟動,F(xiàn)lash初始化失敗
MIMXRT1024-EVK閃存初始化失敗的原因?
【資料分享】NXP i.MX 8M Mini評估版測試手冊(1)
AD2S1210初始化中讀寫寄存器失敗的原因?如何解決?
LINUX系統(tǒng)引導和初始化-LINUX內核解讀
Linux內存初始化
在51平臺下初始化文件的引入導致全局變量無法初始化的問題如何解決
如何使用精確估計滿秩空間相關矩陣實現(xiàn)MNMF穩(wěn)定初始化的方法
MPU6050初始化失敗
M.2接口的固態(tài)硬盤有何優(yōu)勢?
多塊 M.2 硬盤拆到崩潰?M.2 硬盤抽取盒才是救星!
linux系統(tǒng)下M.2硬盤調試和測試全指南:從初始化失敗到讀寫滿速,避坑就看這篇
評論