文章目录
- 一. SATA 定义
- 二. SATA的逻辑结构
- 2.1 Phy Layer(物理层)
- 2.2 Link Layer(链路层)
- 2.3 Transport Layer(传输层)
- 2.4 Device & Host Command
- 2.4.1 Power-on and COMRESET protocol
- 2.4.2 Software reset protocol
- 2.4.3 EXECUTE DEVICE DIAGNOSTIC command protocol
- 2.4.4 DEVICE RESET command protocol
- 2.4.5 Non-data command protocol
- 2.4.6 PIO DATA-IN command protocol
- 2.4.7 PIO DATA-OUT command protocol
- 2.4.8 DMA DATA-IN command protocol
- 2.4.9 DMA DATA-OUT command protocol
- 2.4.10 READ DMA QUEUED command protocol
- 2.4.11 WRITE DMA QUEUED command protocol
- 2.4.12 FPDMA Read command protocol
- 2.4.13 FPDMA Write command protocol
- 2.5 Application and Command Layer(应用层)
- 三. Error Handle(错误处理)
- 四. Register(寄存器)
- 五. Q&A
- 六. 参考资料
- 七、意见与反馈
一. SATA 定义
SATA(Serial Advanced Technology Attachment): 是一种用于连接计算机和存储设备的接口标准。
- 高速传输:相比之前的并行 ATA 接口,SATA 提供了更高的数据传输速率(1.5 / 3 / 6 Gbps)。
- 串行传输:采用串行方式传输数据,减少了并行传输中的信号干扰和同步问题,提高了数据传输的准确性和稳定性。
二. SATA的逻辑结构
如图2所示,按逻辑功能划分,SATA可以分为 Application Layer(应用层),Transport Layer(传输层), Link Layer(链路层),Phy Layer(物理层)。
- Application Layer(应用层): 负责处理Command。
- Transport Layer(传输层): 根据Command的种类构造和分解FIS(Frame Information Structure)。
- Link Layer(链路层): 在FIS前后插入控制字符,并进行编码和解码(8b/10b),以及CRC(Cyclic Redundancy Check)校验。
- Phy Layer(物理层):通过OOB(Out-of-Band)信号的检测和Primitives的交互,实现Host与Device之间的链路初始化;使用串行的方式传输和接收数据。
2.1 Phy Layer(物理层)
SATA物理层负责主机与存储设备间的数据传输,利用8b/10b编码平衡信号、便于时钟同步并降低误码率。通过差分信号对实现高速串行传输,支持1.5 Gbps、3 Gbps和6 Gbps的速率,并向下兼容。物理层还负责链路的初始化和同步,以及信道训练和时钟恢复,确保数据传输的稳定性。同时,其电气特性设计增强了抗干扰性,保证了传输的可靠性。
Phy Layer(物理层)的主要作用如下:
- 串并转换:Rx通道将串行信号转为并行信号, Tx通道将并行信号转为串行信号。
- OOB信号的产生和检测:生成并检测OOB信号(Out Of Band),用于建立信号连接。
- 字节对齐:检测Align Primitive ,调整对齐边界。
- 向Link Layer发送状态(已连接、未连接、已连接但是速率协商失败)。
2.1.1 OOB(Out Of Band)
OOB(Out Of Band)由一组特殊的二进制数据的Brust组成(如图3所示),主要是用于建立信号连接。其作用可以分为以下四个部分
- 初始化(initialization)。
- 传输速率的协商与对接(Speed negotiation)
- 重置(Reset)。
- 从省电状态(Slumer/Partial)的唤醒。
OOB信号可以分为 COMRESET, COMINIT ,COMWAKE,每种信号都有其特殊作用。
- COMRESET:Host对Device进行硬件重置以及SATA信号的重新建立。
- COMINIT:由Device送往Host,要求信号初始化。
- COMWAKE:Host或是Device装置可以激发该信号来将 Phy 从省电状态(Slumer/Partial)中唤醒。
COMRESET, COMINIT ,COMWAKE三者主要是由4个Gen1 ALIGNp Primitives(这个后面会进行介绍) 的 brust或者 4Gen1 Dwords(4 个 D24.3 characters)的brust。由图3 我们可以看出,COMRESET和COMINIT结构保持一致,不同的是,COMWAKE中的时间间隔(T1)为320ns,而COMRESET/COMINIT的时间间隔(T2)为106.7ns。
2.1.2 Power management(电源管理)
在SATA(Serial ATA)协议中,Phy Layer(物理层)的Power management(电源管理)设计主要是为了减少功耗,特别是在设备不活跃的情况下。SATA电源管理在Phy Layer(物理层)通常在几种不同的电源状态间进行转换。这些状态包括:
-
Active:在Active状态下,Device 和 Host 之间的 Phy Layer(物理层)连接是完全激活的,可以正常传输或接收数据。
-
Partial:在Partial状态下,Device 中的Signal Lines处于 Common mode voltage(电压低于Active状态下的电压)。在这样的状态下,功耗较低,恢复到Active状态的时间较短(大约为10微秒)。
-
Slumber:在Slumber状态下,允许更低的电压值(限制在正常范围内,0-2000mV),比Partial模式进一步降低了功耗,适合较长时间的不活跃状态。Slumber模式会关闭更多的电路,以实现更大的功耗节省,恢复到Active状态的时间稍长(大约为10毫秒)。
-
DevSleep:在DevSleep状态下,Device几乎完全关闭,只保留一个最小的电源保持部分连接。DevSleep是SATA 3.2引入的一个更深度的电源管理模式,旨在显著降低功耗。当需要恢复时,恢复时间较长,但功耗也最低,适合更长时间的不活动状态。
为了更合理的控制功耗,SATA 设置了不同模式之间的自由转换。
- Partial/Slumber => PHYRDY:
Host/Device发送COMWAKE将Device/Host从省电模式唤醒。 - PHYRDY => Partial/Slumber
由PHYRDY 转为 Partial/Slumber的过程如4所示
2.1.3 Power on(上电)
在SATA接口的上电过程中,涉及一系列初始化步骤,以确保主机与设备之间的连接能够稳定、可靠地建立。SATA设备的上电过程主要分为以下几个阶段:
- Host 发送COMRESET并循环检测Device的回复。
- Device发送COMINIT,并循环检测Host的回复。
- 收到Device的COMINIT后, Host回复COMWAKE,并循环检测Device的回复。
- 收到Host的COMWAKE后, Device回复COMWAKE,循环检测Device的回复。并以最高速度发送ALIGN primitive。
- 收到Device的COMWAKE后, Host以最低速率发送D10.2。同时如果接收到来自Device的ALIGN后,以相同的速度发送ALIGN给Device
- 当Host接收到三个非ALIGNp后,链结建立完成,进入正常操作。
其中需要注意以下几点
- 在1完成后,如果Device没有回复COMINIT,那么Host就会一直发送COMRESET,直到Host
Software的介入才会停止。 - 在3完成后,Host至少要在873.8 us内接检测到ALIGNp,否则会重新启动Power on程序(发送COMRESET),直到Host Software的介入。
- 在4中,如果Device在54.6us内未检测到来自Host的ALlGNp且没有额外的速度可以使用,则进入错误处理,等待重新连接。
2.1.4 Speed negotiation(速度协商)
在SATA协议中,Speed Negotiation(速率协商)是指主机和设备在链路初始化过程中,确定数据传输速率的步骤。SATA的速率协商过程使得主机和设备能够在兼容的最大速率下进行通信。SATA目前支持三种数据传输速率:1.5 Gbps(SATA I)、3.0 Gbps(SATA II)和6.0 Gbps(SATA III)。
Power On(上电)的最后就是Host和Device在进行速度协商。协商的过程如下
- Device 以 Gen3(6 Gbps)de 速度发送ALIGNp Primitives,并等待Host的回复。如果Host以 Gen3(6 Gbps)de 速度回复ALIGNp Primitives, Speed negotiation(速度协商)成功。否则进入第二步。
- Device 以 Gen2(3 Gbps)de 速度发送ALIGNp Primitives,并等待Host的回复。如果Host以 Gen2(1.5 Gbps)de 速度回复ALIGNp Primitives, Speed negotiation(速度协商)成功。否则进入第三步。
- Device 以 Gen1(1.5 Gbps)de 速度发送ALIGNp Primitives,并等待Host的回复。如果Host以 Gen1(1.5 Gbps)de 速度回复ALIGNp Primitives, Speed negotiation(速度协商)成功。否则速度协商失败,重新进行Power On(发送COMRESET)。
2.2 Link Layer(链路层)
SATA链路层在主机与存储设备间的通信中负责数据帧(FIS)的封装与传输控制,确保数据传输的完整性。它通过管理链路状态(如空闲、活动、低功耗)和使用控制符(如SYNC、ALIGN)来维持链路稳定,并通过CRC检测错误,必要时触发重传以恢复数据。总之,链路层通过状态管理和错误检测机制实现了高效可靠的通信。
Link Layer(链路层)的主要作用如下:
- 构建Frame:链路层将传输层的数据封装为Frame Information Structure(FIS)帧,以适应SATA协议的传输格式
- 传输和接收Frame和Primitive
- CRC的生成和检测:链路层通过循环冗余校验(CRC)来生成并验证数据帧的校验码,确保数据在传输过程中不受干扰或损坏。当链路层检测到数据错误时,可通过重新发送帧来实现数据恢复,保障数据传输的完整性。
- 8b/10b编解码:链路层使用8b/10b编码方式将8位数据转换为10位编码,确保数据流中的信号平衡,避免直流偏移,并提供足够的状态转换以便恢复时钟信号。这种编码方式能够增强链路的抗干扰能力,提高数据传输的可靠性。
2.2.1 Frame
Frame 是Link Layer的一种数据传输结构。每个Frame可以包含一个或多个FIS(Frame Information Structure)。
2.2.2 Primitive
Primitive 是一种由链路层(Link Layer)生成和识别的特殊编码符号,用于管理链路状态、指示事件并维持主机与存储设备之间的同步。
一些主要的Primitive其作用如下图所示:
在介绍了每种Primitive的作用后,我们来看看每种Primitive的组成。每种Primitive都由不同的4字节特殊编码组成(如下图所示),每个Byte编码(K28.5, D27.3)的二进制字符串可以在 《四. 参考资料 【1】SerialATA_Revision_3_5_Gold的 Table 88》 找到。
2.2.3 CRC(Cyclic Redundancy Check)
CRC(Cyclic Redundancy Check, 循环冗余检验):用于检测数据的正确性。在要发送的K比特长度的数据后面附加一个R比特长度的校验码(如图10所示),然后生成一个新帧发送给接收端。接收端接收到新帧后,根据收到的数据和校验码来验证接收到的数据是否正确。
为了更好的理解CRC,这里我们举例来进行说明:
假设𝐆(𝐗)=𝐗^𝟒+𝐗+𝟏(除数为10011),数据为101100110100。使用数据与除数做除数运算(异或运算),得到的余数就是CRC校验码(除数为5位,则CRC校验码为4位)。
2.2.3 Flow Control (流量控制)
Flow Control (流量控制) 在SATA协议中是一项重要的机制,用于在主机和存储设备之间协调数据传输速度,防止数据溢出或丢失。通过流量控制,链路层可以根据双方的接收能力调整数据的传输速率,确保通信顺畅。
一般来说,需要Flow Control有以下两种情况
- 发送端Tx Buffer接近空/满的时;
- 接收端Rx Buffer接近满/空的时
2.3 Transport Layer(传输层)
Transport Layer(传输层):用于构造和分解用于传输Data的FIS(Frame Information Structures)。
2.3.1 FIS(Frame Information Structure)
FIS(Frame Information Structure):一种用于Host和 Device之间信息传输的机制,每个FIS的格式都是固定的,并且对应唯一的ID。
2.3.1.1 Register Host to Device FIS(27h)
Register Host to Device FIS(27h): 将Host中的Shadow Register Block中的内容发送给Device。
- Feature:Shadow Register Block中的 Feature Register的内容。
- Command:Shadow Register Block中的 Command Register的内容。
- C:用于指示更新的是Command Register(1)还是Device Control Register(0)。
- PM Port:在使用PM Port时,指示Device连接的 Port, 由主机设置。
- Device:Shadow Register Block中的 Device Register的内容。
- LBA:Shadow Register Block中的 LBA Register的内容。
- Count:Shadow Register Block中的 Sector Count Register的内容(Sector的数量)。
- ICC:Isochronous Command Completion, 用于通知device关于 Command执行时间的限制。
- Control:Shadow Register Block中的Device Control Register的内容。
- Auxiliary:Command的参数。
2.3.1.2 Register Device to Host FIS(34h)
Register Device to Host FIS(34h) : 将Device中的Shadow Register Block中的内容发送给Host。
- Error:Shadow Register Block中的 Error Register的内容
- Status:Shadow Register Block中的 Status Register的内容
- I:中断(I)位,这个位反映了Device的中断Line。
- 其余与 Register Host to Device FIS(27h) 相似。
2.3.1.3 Set Device Bits (A1h)
Set Device Bits(A1h): 用于Device加载Shadow Register Block的内容。
- Status Hi:Shadow Register Block中的 Status Register的第6,5,4 bit的值
- Status Lo:Shadow Register Block中的 Status Register的第2,1,0 bit的值
- N:如果该位被设置为1,Host应该询问device并确定需要什么类型的操作(详情请看六. 参考资料 SerialATA_Revision_3_5_Gold 章节13.8)。
- I:中断位,Shadow Register Block 中的BSY和DRQ被清为0,则Host进入Interrupt PedingState。
如果Host正在处理NCQ commands,则不论BSY和DRQ的值是什么,Host都会进入Interrupt PedingState。 - Protocol Specfic:由Protocol 设置, 在NCQ中,用于指示32 条CMD的执行情况。
2.3.1.4 DMA Activate(39h)
DMA Activate(39h): 用于Device 激活Host,以接收数据。
- Host只有在接收到DMA Activate(39h)后,才能发送Data FIS(正常情况下,在发送每个Data FIS前都需要)。
2.3.1.5 DMA Setup(41h)
DMA Setup(41h): 用于请求Host或Device在传输数据之前对其DMAController进行Program。
- A:Auto-Activate bit(A),是否需要在发送第一个Data FIS前发送DMA Activate FIS。
- D:Direction Bit, 数据传输的方向,1代表由Transmitter 到Receiver,0代表由Receiver 到Transmitter
- DMA Buffer Identifier Low/High :标识Host内存中的DMA Buffer(物理地址)。
- DMA Buffer Offset:Byte offset。
- DMA Transfer Count:读或写的Bytes数量。
2.3.1.6 BIST Activate(58h)
BIST Activate(58h):让对方进入测试模式。
- Pattern Definition :用于确定测试模式,其中,T, F和L是互斥的。
- Data: BIST Activate FIS 的结果,用于确定Pattern,只有Tbit为1时有效
2.3.1.7 PIO Setup(5Fh)
PIO Setup(5Fh):Device 提供 Programmed Input/Output(PIO)的信息给Host,用于Host处理PIO数据
的Transfers。
- E_Status: 在Data FIS 传输结束后的Command Block 中的Error Register的新值。
- Count: Shadow Register Block 中Count Register中的值。
- Trnsfer Count: Data FIS 中Byte数量。
2.3.1.8 Data(46h)
- N Dwords of data: 包含要传输的实际数据。
2.4 Device & Host Command
Application and Command Layer(应用层): 主要负责解释和执行基于ATA(高级技术附件)命令集。
2.4.1 Power-on and COMRESET protocol
2.4.2 Software reset protocol
2.4.3 EXECUTE DEVICE DIAGNOSTIC command protocol
- DEDD0: Execute_device_diag: 如果EXECUTE DEVICE DIAGNOSTIC Command时,进入此状态。
在该状态下,Device 执行Diagnostics。 - DEDD1: Send_good_status:Device 执行完成Diagnostics时进入此状态。
在该状态下Device 将发送一个Register Device to Host FIS(Interrupt 为 1) 给Host。
2.4.4 DEVICE RESET command protocol
- DDR0: Device_reset : 如果收到一个DEVICE RESET command 进入此状态.
在此状态下Device 停止正在进行的Activity。进行Diagnostics,Diagnostics完成后进入
DDR0: Device_reset 。
2.4.5 Non-data command protocol
2.4.6 PIO DATA-IN command protocol
2.4.7 PIO DATA-OUT command protocol
2.4.8 DMA DATA-IN command protocol
2.4.9 DMA DATA-OUT command protocol
2.4.10 READ DMA QUEUED command protocol
2.4.11 WRITE DMA QUEUED command protocol
2.4.12 FPDMA Read command protocol
2.4.13 FPDMA Write command protocol
2.5 Application and Command Layer(应用层)
2.5.1 IDENTIFY DEVICE command
IDENTIFY DEVICE command: Device传输设备信息给Host。例如制造商、型号、固件版本、序列号,支持不支持NCQ, 支持的传输速率有哪些等等。共256Word。
2.5.2 SET FEATURES command
SET FEATURES command: Host告知Device需要开启哪些Feature。
2.5.3 NCQ(Native Command Queuing)
NCQ(Native Command Queuing):允许Host发送多个Command给Device,根据执行时间的限制排序后进行执行。当Host发送多条Command到Device,Device可以优化完成这些Command的顺序(缩短执行的总时间),从而达到提升性能的目的。NCQ Command 包括 READ FPDMA QUEUED Command 和 WRITE FPDMA QUEUED Command。
2.5.3.1 READ FPDMA QUEUED Command
READ FPDMA QUEUED Command 用于读数据。其D2H FIS结构也有所不同,其结构如下图所示。
接下来我们举例来解释一下NCQ。假设当前有两笔CMD,Tag值分别是0和5,其执行过程如下图所示。
2.5.3.2 WRITE FPDMA QUEUED Command
WRITE FPDMA QUEUED Command 用于写数据。其D2H FIS结构如下图所示。
发送一次Data FIS 和多次Data FIS 的WRITE FPDMA QUEUED Command,其执行过程如下图所示。
2.5.3.3 Success OutPuts
Success OutPuts:成功执行Command(一条或多条)后,Device 将发送一个Set Device Bits
FIS(Interrupt 为1,ACT中的一个或多个位被置为0). SDB FIS 可以在一条CMD 成功执行后发出,也可以等多个CMD成功后发出。SDB格式如下图所示。
- ACT: CMD 的Tag值,CMD成功执行后将其对应Bit置为1。例如,Tag=0,则Bit 0 置为1, Tag=3,则Bit 3 置为3。
2.5.3.4 Error OutPuts
在发生错误后,将对应的错误代码填入Register Device to Host FIS的Error位置并发送给主机。此时,会停止处理任何未完成的或新的命令。
三. Error Handle(错误处理)
Error Handling: SATA每一层都有错误检测以及错误信息的上报(所有的错误信息都储存在SStatus和SError寄存器中)。一般Error responses可以分为四类,分别是:
- Freeze:当出现最严重的Error(即状态已被严重扰乱,且无法恢复)时,使用Freeze(使用reset或类似的操作来恢复所有必要的状态,以恢复正常操作。
- Abort:当出现可能会持续很久的Error,使用Abort。向上层发送信息,以告知Host Software当前的情况。
- Retry:当出现暂时的Error,使用Retry(只有系统状态没有被扰乱时使用)。这种操作可以由相应层中的恢复和错误控制动作直接处理,也可以由Host Software处理。
- Track/ignore:当出现非关键性的Error时(例如Retry 或者其他恢复操作造成的),使用Abort,Track/ignore, 对Error进行追踪或者忽略。
3.1 Phy Error Handling
在Phy Layer(物理层)出现的Error有以下几种:
- no device present
- OOB signaling sequence failure
- Phyinternal error
针对不同的Error有不同的Response,如下:
- 将Error信息存储在SStatus中,以便Host进行相应的操作。
- 链路建立不成功,Device保持在重置状态,直到主机软件介入。
- 根据检测到的Error将相应的信息存到SStatusregister 和SError register 中。
3.2 Link Error Handling
在Link Layer(链路层)出现的Error有以下几种:
- invalid state transitions:通常是不符合协议的序列。
- data integrity errors:8b/10b解码时发现错误。CRC检测到错误。
针对不同的Error有不同的Response,如下:
- invalid state transitions:通常是不符合协议的序列。
- data integrity errors:8b/10b解码时发现错误。CRC检测到错误。
3.3 Transport Error Handling
在Transport Layer(传输层)出现的Error有以下几种:
- internal errors:速度不匹配。
- frame errors:无效FIS type的Frame和长度不正确的Register Frame。
- protocol errors:PIO count与随后传输的数据字符数不匹配。
- state errors:
针对不同的Error有不同的Response,如下:
- 通知Host Software来处理。
- 在系统状态没有受到干扰的情况下,进行多次重传的尝试。否则向Host Software报告,进行Reset。
- 返回到已知状态进行处理。
- 返回到已知状态进行处理。
可以Retry的FIS类型如下:
3.4 Application Error Handling
在Application Layer(应用层)出现的Error有以下几种:
- bad status in the Command Block Status register :读取的数据地址不存在,无法从给定Sector中读取数据
- bad status in the SError register :
- command failed to complete:Command执行超时。
Response
Application Layer(应用层)的Erroe都通过四个基本的Response进行处理。
四. Register(寄存器)
4.1 Shadow Register
4.2 Status Register
4.3 Error Register
4.4 SStatus Register
4.5 SError Register
4.6 SControl Register
五. Q&A
- Power-on时,Host/Device 接收到PMACKp原语后一定进入Slumber/Partial状态吗?
答:不一定。如果选择进入Slumber/Partial状态回复PMACKp,如果不进入Slumber/Partial状态或者没有相应的power mode 则回复PMNAKp。
六. 参考资料
[1] SerialATA_Revision_3_5_Gold
七、意见与反馈
各位读者,如果您有任何问题和建议,欢迎在评论区留言,或者发送邮件至 246676491@qq.com,我会及时回复您。感谢您的支持!