1)實驗平臺:正點原子ATK-DLRK3568開發板
2)平臺購買地址:https://detail.tmall.com/item.htm?id=731866264428
3)全套實驗源碼+手冊+視頻下載地址: http://www.openedv.com/docs/boards/xiaoxitongban
第四十六章 M.2硬盤驅動實驗
M.2 硬盤,也被稱為 M.2 SSD(Solid-State Drive),是一種高性能的存儲設備,它采用 M.2 接口標準連接到計算機的主板上。M.2 硬盤具有許多優點,包括高速讀寫性能、小型尺寸、低功耗和可靠性。現在的計算機普通都有M.2接口,一般使用的協議都是PCIe。有的支持PCIe 2.0、PCIe 3.0甚至PCIe 4.0。PCIe 3.0 相對于 PCIe 2.0 提供了更高的帶寬和性能,適用于需要高速數據傳輸的應用,如圖形卡和高性能存儲。ATK-DLRK3568底板有一路M.2接口使用的是PCIe 3.0總線,支持PCIe 3.0,本章我們來使用PCIe3.0驅動M.2硬盤。
46.1 M.2接口簡介
M.2 接口是一種物理接口標準,它可以支持多種不同的通信協議,包括 PCIe(Peripheral Component Interconnect Express)、SATA(Serial Advanced Technology Attachment)、USB(Universal Serial Bus)等。因此,M.2 接口的速度和性能取決于所使用的通信協議和硬件實現。M.2 接口可以支持 PCIe 3.0,這是一種高速的數據傳輸協議,通常用于連接圖形卡、固態硬盤(SSD)以及其他需要高帶寬的設備。
M.2 插槽有不同的物理尺寸,包括 2242、2260、2280 和 22110 等。這些數字表示了插槽的長度和寬度。不同尺寸的插槽可容納不同尺寸的 M.2 模塊,以適應各種設備。正點原子的ATK-DLRK3
568開發板接口采用的是2280規格,詳細請參考07、硬件資料05、板載連接器規格參考15、M.2座子下的文檔說明。
ATK-DLRK3568底板M.2接口如下圖圖46.1.1,支持PCIe3.0。注意,5G模塊接口也是用的M.2接口使用的是USB協議,兩個座子的規格一樣。
圖46.1.1 M.2座子
46.2 RK3568 PCIE3.0簡介
RK3568芯片擁有一個PCIe3.0 x2 Lane Dual Mode控制器,一個PCIe3.0 x1 Lane RC Mode控制器,一個PCIe3.0 x2 Lane PHY。PCIe3.0 x2 Lane Dual Mode控制器和PCIe3.0 x1 Lane RC Mode控制器都連接到PCIe3.0 x2 Lane PHY。連接示意圖如下圖46.2.1。
圖46.2.1 PCIe3.0控制器/PCIe3.0 PHY框圖
由上可知,兩個控制器連接同一個PHY,這里我們先了解一下,因為后面設備樹會用這部分知識。
46.3 硬件原理圖
原理圖如下圖46.3.1,與SATA硬盤驅動實驗章節一樣,PCIE也屬于專用IO,只需要啟用對應的控制器,IO會復用成相應模式。下圖我們只需要配置PCIE30X2全局復位IO即可。可以看到復位IO是GPIO2_PD6。
圖46.3.1底板M.2硬盤接口原理圖
46.4實驗程序編寫
46.4.1 修改設備樹
前面說過PCIe所用的引腳屬于專用引腳,只需要啟用對應的控制器,對應的引腳將被設置成對應的模式。如PCIE30X2_WAKEn_M1(喚醒輸入)引腳,參考08、RK官方文檔01、LinuxRK356XDatasheet Rockchip_RK3568_Datasheet_V1.1-20210305.pdf可知這個引腳可以復用為LCDC_D5/VOP_BT656_D5_M0/SPI2_CS0_M1/PCIE30X2_WAKEn_M1/I2S1_SDI2_M2/GPIO2_D5_d模式。在設備樹里我們啟用pcie3x2及pcie30phy控制器節點,查看rk3568-atk-evb1-ddr4-v10.dtsi,可以看到以下內容:
示例代碼46.4.1 啟用pcie30py控制器和pcie3x2節點
738 &pcie30phy {
739 status = "okay";740 };741 742 &pcie3x2 {743 //pinctrl-names = "default";744 //pinctrl-0 = <&pcie30x2m1_pins>;745 reset-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>;746 vpcie3v3-supply = <&vcc3v3_pcie>;747 status = "okay";748 };
746~744,看到pinmux被注釋,我們不用配置,啟用對應的控制器即可。
第746行,reset-gpios的管腳為GPIO2_D6。
再打開rk3568.dtsi查看如下內容。
示例代碼46.4.2 兩控制器連接到一個PHY
1 pcie3x1: pcie@fe270000 {
2 compatible = “rockchip,rk3568-pcie”, “snps,dw-pcie”;
3 #address-cells = <3>;
4 #size-cells = <2>;
5 bus-range = <0x10 0x1f>;
…
29 msi-map = <0x1000 &its 0x1000 0x1000>;
30 num-lanes = <1>;
31 phys = <&pcie30phy>;
32 phy-names = “pcie-phy”;
33 power-domains = <&power RK3568_PD_PIPE>;
…
53 };
54
55 pcie3x2: pcie@fe280000 {
56 compatible = “rockchip,rk3568-pcie”, “snps,dw-pcie”;
57 #address-cells = <3>;
58 #size-cells = <2>;
59 bus-range = <0x20 0x2f>;
…
83 msi-map = <0x2000 &its 0x2000 0x1000>;
84 num-lanes = <2>;
85 phys = <&pcie30phy>;
86 phy-names = “pcie-phy”;
…
94 reg-names = “pcie-dbi”, “pcie-apb”;
95 resets = <&cru SRST_PCIE30X2_POWERUP>;
96 reset-names = “pipe”;
97 /* rockchip,bifurcation; lane0 when using 1+1 /
98 status = “disabled”;
99
…
107 };
第31和85行可知pcie3x1和pcie3x2連接到同一個pcie30phy,正點原子ATK-DLRK3568M.2接口使用的是2通道的PCIE接口,也就是pcie3x2。
46.4.2 運行測試
ATK-DLRK3568 linux默認就支持M.2接口硬盤。無需我們重新修改設備樹。直接在出廠的Linux buildroot系統上測試M.2硬盤是否支持。
測試方法與45.3.2一樣,只是M.2硬盤設備節點變成了/dev/nvme0n1p。這里我們就不重復寫測試方法了。