目录
- 一、简介
- 二、总体介绍
- 2.1 详细FIS传输过程
- 2.2 FIS内容详解
- 三、FIS实例
- 3.1 构造一个write FIS
- 3.1.1 WRITE FIS内容
- 3.1.2 协议分析仪trace分析
- 3.1.3 write过程总trace
- 3.2 构造一个read FIS
- 3.2.1 READ FIS内容
- 3.2.2 协议分析仪 read trace
- 3.2.3 read过程总trace
- 3.3 FIS和Command List储存
- 3.3.1 HBA Memory Space Usage
- 3.3.2 具体FIS存放规则
- 3.4 Comand List
- 3.4.1 Port System Memory Structures
- 3.4.2 command具体内容
- 3.4.3 构造一个Command List
- 四、其他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接口区别总结
一、简介
FIS是一种用于Host和device之间信息传输的机制,每个FIS的格式都是固定的,并且对应唯一的ID。本文主要介绍常用FIS传输过程和对FIS内容进行详解,通过构造的FIS例子方便大家快速掌握FIS,常用的FIS TYPE如下:
二、总体介绍
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上的信息。该结构由PxFBU和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个条目。PRD表中每个字段的细分如下所示。第0项是指在PRD表中的第一个条目。“CH[PRDTL] - 1”指的是表中的最后一项,其中长度为字段来自该命令槽的命令列表条目中的PRDTL字段。