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。这里我们就不重复写测试方法了。