1)实验平台:正点原子ATK-DLRK3568开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=731866264428
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban
第四十五章 SATA硬盘驱动实验
SATA(Serial Advanced Technology Attachment)存储接口是一种用于连接计算机硬盘、光驱和其他存储设备的串行接口标准。瑞芯微的RK3568芯片支持SATA外设接口,可以用来连接SATA接口的硬盘,本章我们就来学习一下如何使用RK3568的SATA接口。
45.1 SATA HOST简介
Sata Host为物理存储设备提供Sata (Serial Advanced Technology Attachment)存储接口。Sata Host支持以下特性:
包含3个端口,每个端口最多可连接5个设备,使用PM交换
整机SATA 1.5Gb/s,SATA 3.0Gb/s,SATA 6.0Gb/s
eSATA
兼容Serial ATA 3.3规格
兼容AHCI Revision 1.3.1
支持OOB信令检测和生成
整机支持机械状态开关和冷态检测
活动LED支持
支持设备热插拔
输出端口,用于指示COMRESET后协商的速度,以进行电源优化
内存ECC (Memory Data Protection)和Error Correction(Error Correction)
内存数据保护诊断错误注入
整机SATA 1.5Gb/s、SATA 3.0Gb/s、SATA 6.0Gb/s速度可调
异步信号恢复,包括重试轮询
电源管理功能,包括自动从部分状态切换到休眠状态
BIST环回模式
硬件辅助的本地命令队列,最多支持32个条目
支持基于fiss交换的端口倍增器
在关机模式下禁用RX和TX数据时钟
任意扇区大小
用于配置的AXI接口只支持单个
用于从内存中获取数据的AXI接口
更多介绍请参考RK3568的参考手册。
RK3568最大支持3个SATA存储接口,在正点原子ATK-DLRK3568底板上已经引出一路SATA2。SATA0和SATA1没有使能,与其他引脚有复用关系。
45.2 硬件原理图
正点原子的ATK-DLRK3568开发板底板板载了SATA接口,及SATA电源接口,原理图如下所示:
图45.2.1 sata接口原理图
SATA接口的引脚属于专用引脚,不能复用能GPIO模式,上图中我们只需要配置SATA2_ACT_LED引脚。SATA 数据传输使用两对差分信号线:一对用于发送数据,另一对用于接收数据。这两对差分信号线通常被称为 “TX+” 和 “TX-” 以及 “RX+” 和 “RX-”。也就是图中的SATA2_TXP和SATA_RXN以及SATA2_RXP和SATA2_RXN。
ATK-DLRK3568底板接口如下图图45.2.2。
图45.2.2 底板sata接口硬件图
45.3 实验程序编写
45.3.1 修改设备树
前面说过SATA所用的引脚属于专用引脚,只需要启用对应的控制器,对应的引脚将被设置成对应的模式。如SATA2_TXP引脚,参考08、RK官方文档01、LinuxRK356XDatasheet Rockchip_RK3568_Datasheet_V1.1-20210305.pdf可知这个引脚可以复用为PCIE20_TXP/SATA2_TXP/QSGMII_TXP_M1模式。在设备树里我们启用SATA节点,查看rk3568-atk-evb1-ddr4-v10.dtsi,可以看到以下内容:
示例代码45.3.1.1 启用SATA2
1&sata2 {
2 status = "okay";
3 pinctrl-names = "default";
4 pinctrl-0 = <&sata2_pins>;
5};ATK-DLRK3568,引出的是SATA2接口,所以使能sata2节点。接着我们在rk3568-pinctrl.dtsi文件中添加中断IO配置信息,如下
示例代码45.3.1.2 IO pinmux配置信息
1 sata {
2 /omit-if-no-ref/
3 sata_pins: sata-pins {
4 rockchip,pins =
5 /* sata_cpdet */
6 <0 RK_PA4 2 &pcfg_pull_none>,
7 /* sata_cppod */
8 <0 RK_PA6 1 &pcfg_pull_none>,
9 /* sata_mpswitch */
10 <0 RK_PA5 2 &pcfg_pull_none>;
11 };
12 };
13
14 sata0 {
15 /omit-if-no-ref/
16 sata0_pins: sata0-pins {
17 rockchip,pins =
18 /* sata0_actled */
19 <4 RK_PC6 3 &pcfg_pull_none>;
20 };
21 };
22
23 sata1 {
24 /omit-if-no-ref/
25 sata1_pins: sata1-pins {
26 rockchip,pins =
27 /* sata1_actled */
28 <4 RK_PC5 3 &pcfg_pull_none>;
29 };
30 };
31
32 sata2 {
33 /omit-if-no-ref/
34 sata2_pins: sata2-pins {
35 rockchip,pins =
36 /* sata2_actled */
37 <4 RK_PC4 3 &pcfg_pull_none>;
38 };
39 };
第1~12行,设置SATA0/1/2控制器相关控制IO。SATA_CP_DET引脚作用是SATA热拔插设备的插拔检测输入。SATA_CP_POD引脚作用是SATA控制热拔插设备电源开关输出。SATA_MP_SWITCH作用是SATA热拔插设备的开关检测输入。可以看到这里虽然配置了,但是我们的sata2的pinctrl并没有使用它,这是瑞芯微配置好的。这些IO可以不使用,RK官方板子也是不使用这些引脚。检测SATA硬盘的接入将由系统完成,系统会使用内核设备添加/移除事件检测SATA硬盘插入/移除之后完成一系列的操作。
第32~39行,这里配置了SATA2的LED,SATA2接口有数据传输时LED闪烁控制输出。
45.3.2 运行测试
ATK-DLRK3568 linux默认就支持SATA接口硬盘。无需我们重新修改设备树。直接在出厂的Linux buildroot系统上测试SATA硬盘是否支持。
1、SATA硬盘连接示意图
若你有接MIPI屏幕,需要将屏幕卸下,接口位于屏幕下面。请将SATA接口硬盘用SATA电源接口线与SATA数据接口线接上。本次以一个日立500GB固态硬盘为例,连接方法如下图,注意,请自备SATA数据线与电源线。SATA接口可热插拨,但是为了保护你的硬盘,建议先断电再插上,然后再开机。
图45.3.2.1 开发板连接SATA硬盘
开机后使用df指令查看硬盘是否已经挂载了。
df
可以看到下图,SATA硬盘会挂载在/media/目录下。比如笔者这个SATA硬盘挂载的目录为/media/usdisk0。
图45.3.2.2 SATA硬盘挂载目录
2、将硬盘分区
使用fdisk指令查看硬盘的节点。
fdisk -l // “-l”是-L,不是数字“1”。
图45.3.2.3 识别到一个500GB的硬盘
从上图图45.3.2.3可知,SATA挂载的节点为/dev/sda,现在开始格式化这个硬盘。如果你的硬盘已经有至少两个分区,那么就会有sda1和sda2。sda与sda1是什么区别?sda是硬盘的节点,sda是硬盘的第一个分区。笔者这个硬盘有两个分区,若还有其他分区则有sda3、sda4等等,依次类推。
因为笔者的这个盘已经是“vfat”格式了,说明可以被Linux识别并挂载,已经挂载的硬盘需要卸载才能被格式化。
所以笔者要卸载上面挂载的硬盘,如果你的硬盘未被挂载就不需要卸载了。
卸载硬盘,执行下面的指令。
umount /dev/sda*
图45.3.2.4 卸载SATA硬盘
现在我们将这个sda进行分区,执行下面指令。
fdisk /dev/sda
图45.3.2.5 开始对SATA硬盘分区
然后可以输入‘m’来查看使用帮助。
图45.3.2.6 输入‘m’查看帮助
常用的选项如下:
-l:列出所有磁盘的分区表信息;
-n:创建新分区;
-d:删除分区;
-t:修改分区的类型;
-p:打印分区表;
-u:以扇区为单位而非柱面为单位来显示和操作分区表;
-m:使用 DOS 兼容的模式。
-w:保存修改
我们输入‘n’,创建一个新分区,然后输入‘p’回车,因为我们这个硬盘分区表格式为MBR格式,支持最大的主分区个数为4个,若输入e的意思是拓展分区可以,可以是无数个逻辑分区。默认起始扇区是63,本次将第一个分区设置大小为1GB。
图45.3.2.7 创建分区
现在我们来分第二个分区,也是分做主分区。如下图步骤。这一次我们将起始位置默认为“2097215”了。因为这个位置刚好是前一个分区的末端。最后一个扇区作为终止位置,也就是说硬盘最大容量减去1GB的大小作为第二个扇区。最后不要忘记输入‘w’来保存修改,否则无法生效。当然你继续分区,根据你自己的需要,主分区只能分4个,扩展分区可以无数多个,之后再保存修改就可以了。
图45.3.2.8 SATA硬盘分区完成
好了,我们分区完成了,现在需要查看分区是否成功。可以看到下图有两个分区,sda1与sda2说明分区成功。
ls /dev/sda*
图45.3.2.9 查看SATA硬盘分区