SATA信息传输FIS结构总结通过实例代码(快速)掌握(二)

一、简介

FIS是一种用于Host和device之间信息传输的机制,每个FIS的格式都是固定的,并且对应唯一的ID。本文主要介绍常用FIS传输过程和对FIS内容进行详解,通过构造的FIS例子方便大家快速掌握FIS,常用的FIS TYPE如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/7a5be2d656f04f48a6a4f45313c8a5b2.png

二、总体介绍

2.1 详细FIS传输过程

当双方都空闲时,都在持续发送 SYNC 原语,这种状态称为空闲状态(IDLE)。发送方想要发起 FIS 发送,它开始持续发送 X_RDY 原语。经过一段延迟后,接收方收到了 X_RDY (该延迟来自链路层、物理层的信号处理延迟),此时如果接收方准备好接收 FIS 了,就持续发送 R_RDY 原语。发送方收到了 R_RDY 原语,就发送一个 SOF 原语,随后紧跟着逐个发送 FIS 数据包的 dword (包括 FIS-type,Payload,CRC),最后一个 dword (CRC) 发送完后要紧跟一个 EOF 原语,然后持续发送 WTRM 原语。接收方收到 SOF 后,开始持续发送 R_IP 原语,指示接受正在进行 (receiving in progress) 。完整地收完 FIS 后进行 CRC 检查。在收到 WTRM 原语后,如果 CRC 检查正确,就持续发送 R_OK 原语,否则持续发送 R_ERR 原语。发送方收到 R_OK 或 R_ERR 后,开始持续发送 SYNC 。接收方收到 SYNC 后,也开始持续发送 SYNC ,至此回到空闲状态,FIS 传输结束。如果发送方收到的是 R_ERR ,就向上层报告错误,上层决定是否重传该 FIS 。

从该过程我们可以看到,当一个通道发送 FIS 时,另一个通道在发送 R_RDY, R_IP, R_OK, R_ERR 这四种原语来控制对方发送 FIS 的过程,因此在一个时间点上 FIS 不可能双向发送。换句话说,SATA在物理上是全双工,在逻辑上是半双工。

另外,由于 HBA 和 device 都有发起 FIS 发送过程的权力,因此有可能刚好 HBA 和 device 都在发送 X_RDY,同时试图启动 FIS 发送。SATA规定这种情况下 HBA 总是要让着 device : HBA 只要检测到了 device 发来的 X_RDY ,就要放弃当前的发送进程,转而发送 R_RDY ,准备接收 device 发来的 FIS 。
在这里插入图片描述

2.2 FIS内容详解

在这里插入图片描述C -当寄存器传输是由于命令寄存器的更新时,这个位被设置为1。当寄存器传输由于设备控制寄存器的更新而被设置为零。
Control -包含Shadow Register的设备控制寄存器的内容
Command - 包含Shadow Register块的命令寄存器的内容
Device-包含Shadow Register的设备寄存器的内容
LBA(7:0) - Contains the contents of the LBA low register of the Shadow Register Block.
LBA(15:8) - Contains the contents of the LBA mid register of the Shadow Register Block.
LBA(23:16) - Contains the contents of the LBA high register of the Shadow Register Block.
LBA(31:24) - Contains the contents of the expanded address field of the Shadow Register Block
LBA(39:32) – Contains the contents of the expanded address field of the Shadow Register Block
LBA(47:40) – Contains the contents of the expanded address field of the Shadow Register Block
Features(7:0) - Contains the contents of the Features register of the Shadow Register Block
Features(15:8) – Contains the contents of the expanded address field of the Shadow Register Block
PM Port – If an endpoint device is attached via a Port Multiplier, specifies the device port address that the FIS should be delivered to.This field is set by the host.
R – Reserved – shall be cleared to zero.
Count(7:0) - Contains the contents of the Sector Count register of the Shadow Register Block.

三、FIS实例

3.1 构造一个write FIS

通过协议可以看到一个write buffer的FIS COMMAND是0xE8,然后Device位根据描述可以填写。
在这里插入图片描述

3.1.1 WRITE FIS内容

在这里插入图片描述

3.1.2 协议分析仪trace分析

对照2.2所描述的FIS结构,SOF可以不关注,第二行开始依次对应一个Dword。
分析第一个Dword,0x0A618027,bit[7:0] = 27代表FIS TYPE,bit[11:8] = 0表示不支持PMP,bit[15:12] = 0x8,表示C bit置位,应从COMMAND位读取bit [23:16] = 0x61为WRITE FPDMA命令,Sector count bit[31:24] = 0x0A,即10 LBA,后面的FIS依次参考分析。
在这里插入图片描述

3.1.3 write过程总trace

在这里插入图片描述在这里插入图片描述

3.2 构造一个read FIS

通过协议可以看到一个read buffer的FIS COMMAND是0xE4,然后Device位根据描述可以填写。
在这里插入图片描述

3.2.1 READ FIS内容

在这里插入图片描述

3.2.2 协议分析仪 read trace

具体分析过程参考3.1.2 write过程
在这里插入图片描述

3.2.3 read过程总trace

在这里插入图片描述

3.3 FIS和Command List储存

HBA使用系统内存的一个区域来通信接收到的fis上的信息。该结构由PxCLB和PxFB所设置的值。
对每个port对应的P#CLB和P#FB寄存器进行赋值
在这里插入图片描述

3.3.1 HBA Memory Space Usage

具体存放位置如下:
在这里插入图片描述

3.3.2 具体FIS存放规则

在这里插入图片描述
当DMA设置FIS从设备到达时,HBA将其复制到该结构的DSFIS区域。
当一个PIO设置FIS从设备到达时,HBA将其复制到该结构的PSFIS区域。
当D2H寄存器FIS从设备到达时,HBA将其复制到该结构的RFIS区域。
当Set Device Bits FIS从设备到达时,HBA将其复制到该设备的SDBFIS区域。

3.4 Comand List

主机与Device通信是通过FIS进行相互通知,通知后Device根据命令内容从command list对应的地址去获取相应的信息。
一个Port最多支持32个command,同时不同的command对应不同的command table。

3.4.1 Port System Memory Structures

在这里插入图片描述

3.4.2 command具体内容

Command List Structure
整体结构内容如下:
在这里插入图片描述
详细内容介绍:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4.3 构造一个Command List

在这里插入图片描述

Command Table
在这里插入图片描述
Command FIS (CFIS)
这是一个软件构建的FIS。对于数据传输操作,这是H2D寄存器FIS格式Serial ATA Revision 2.6规范中规定的。HBA卡设置PxTFD.STS。BSY,然后发送此结构为附加端口。如果附加了端口倍增器,则该字段必须具有端口倍增器FIS本身的端口号-它不能由HBA卡添加。CFIS的有效长度为2 ~ 16个Dwords并且必须是Dword粒度。
ATAPI Command (ACMD)
这是一个软件构造的区域,长度为12或16字节,包含ATAPI命令to如果在命令头中设置了“A”位,则发送。ATAPI命令长度为12或16字节在长度。HBA卡传输的长度由bios发送的PIO设置FIS决定请求ATAPI命令的设备。
Physical Region Descriptor Table (PRDT)
该表包含数据传输的分散/收集列表。它包含一个0的列表(没有数据要传输)最多65,535个条目。第0项是指在PRD表中的第一个条目。“CH[PRDTL] - 1”指的是表中的最后一项,其中长度为字段来自该命令槽的命令列表条目中的PRDTL字段。

四、其他trace

4.1 PIO SETUP FIS

在这里插入图片描述

4.2 DMA SETUP FIS

在这里插入图片描述

4.3 DATA FIS

在这里插入图片描述

4.4 Set Device Bist FIS

在这里插入图片描述

五、其他链接

1、SATA模块之HBA卡开发总结(一)

2、PCIe物理层总结-PCIE专题知识(一)

3、PCIe数据链路层图文总结-PCIe专题知识(二)

4、SSD硬盘SATA接口和M.2接口区别总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值