加载中…
个人资料
古猫先生-存储随笔
古猫先生-存储随笔
  • 博客等级:
  • 博客积分:0
  • 博客访问:35,691
  • 关注人气:10
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

SATA协议Link Layer链路层解析

(2017-05-02 13:37:26)
标签:

ssd

sata

链路层

分类: SATA协议

一、故事前传

在之前的文章中,我们有提到SATA主要包括:应用层(Application Layer), 传输层(Transport Layer),链路层(Link Layer)以及物理层(Physical Layer), SATA结构如下图:

SATA协议Link <wbr>Layer链路层解析

较为详细解释请见之前的文章"浅析SATA Physical Layer物理层OOB信号",我们这里主要解析Link layer相关内容。


二、SATA Link Layer解析

我们先来看看link layer的结构

SATA协议Link <wbr>Layer链路层解析

从上面Link layer的结构,我们可以看到link layer的作用大致可以包括以下几点:

  • Frame flow control

  • CRC的生成与检测

  • 对数据与控制字符的Scrmable/Descramble

  • 8b/10b编解码

  • 将传输层进来的数据转为Frame


Link  layer在SATA通讯中参与的过程可以这样理解:

  1. 通过插入各种primitive基元(详细解析请见本篇后面内容)进行流量控制,在成功传递完有效资料后,链结层(Linker layer)等待对方的应答,并把结果传给上层;

  2. 传输层(transport layer)传送进来FIS,链结层(Linker layer)计算CRC值,加扰(Scramble)和8B/10B编码后,加上SOF和EOF封装成frame ,传递给物理层(Physical layer)。

    注:SOF=Start of Frame, EOF=End of Frame。

  3. 从物理层接收到有效资料时,进行8B/10B解码、解扰(Descramble)以及CRC效验,然后将资料提交到传输层。 

    SATA协议Link <wbr>Layer链路层解析


接下来,我们对几个关键的部分展开解析一下:

1. 8b/10b编解码

8b/10b编码是目前高速串行通信中经常用到的一种编码方式,直观的理解就是把8bit数据编码成10bit来传输


为什么要引入这种机制呢?其根本目的是“直流平衡”。当高速串行流动逻辑1或逻辑0有多个位没有产生变化时,信号的转换就会因为电压位阶段关系而造成信号错误,直流平衡的最大好处便是可以克服以上问题。


将8bit编码成10bit后,连续的1或者0不能超过5位,所以10b中0和1的位数只可能出现3中情况:

  • 有5个0和5个1

  • 有6个0和4个1

  • 有4个0和6个1


这样引出了一个新术语“不均等性”(Disparity),就是1的位数和0的位数的差值,根据上面3种情况就有对应的3个Disparity0、-2、+2.


在SATA协议中资料值可以统一的表示为Dx.y或Kx.y,其中D表示资料字元,K表示特殊的控制字元, x表示输入的原始资料的低5位元,y表示输入的原始资料的高3位元。 通俗的讲,也就是8bit原始数据会分成两部分,其低5位进行5B/6B编码,高3位则进行3B/4B编码。


对K控制字元的编码方式和D资料字元编码方式一样。

协定中只使用了两个控制字元K28.3和K28.5 

  • K28.5只用在Primitive基元ALIGNp byte0, 

  • K28.3用在除ALIGNp之外的其他任何Primitive基元的byte0.

SATA协议Link <wbr>Layer链路层解析


举个栗子:例如一个8bit数据101 10101,x=10101(十进制为21) y=101(十进制为5),我们就把这8bit数据写成D21.5。对照5B/6B以及3B/4B加密对照表(如下表),可以得到10bit数据为101010 1010

SATA协议Link <wbr>Layer链路层解析

SATA协议Link <wbr>Layer链路层解析


2. 加扰(Scramble)/解扰(Descramble)

资料在进行8b/10b 编码之前,必须先行资料加扰(Scramble)的处理,目的是為了降低EMI(Electromagnetic Interference,电磁干扰)。 


实现方式是由LFSR(Linear Feedback Shift Register)的方式来实践;

基本原理是将资料的8 位元与LFSR 寄存器的16 位元输出做XOR 的处理。

 

  • 规定LFSR的初始值為0xFFFF,

  • LFSR必须在SOF标志前就要被初始化,

  • 在SOF与EOF之间的资料,包括CRC值都需要加扰。

  • 对于控制基元Primitive是不需要加扰的 。


SATA协议中资料处理流程如下 :

  1. 对于一个资料包,在SOF后的资料就必须计算其CRC值,同时这个资料必须和扰码器的输出进行XOR操作,操作结果送往8B/10B编码器编码;

  2. 反之,在接收方,资料先通过10B/8B解码,再与扰码器的输出结果进行XOR操作,最后计算资料的CRC值。


3. CRC(Cyclic Redundancy Check)循环冗余校验码

CRC的计算范围包括SOF和EOF之间的所有资料(即不包括控制基元),以Dword(32-bit)为单位,如果资料的内容不是Dword的整数倍,需要在资料包的后面用‘0’来补充。


  • 协议规定CRC的初始值為0x52325032,

  • SOF和EOF之间的所有资料不能超过2064个Dwords

    SATA协议Link <wbr>Layer链路层解析


4. Frame结构

SATA协议中所有Frame的结构均是包含四个部分:SOFPayload DataCRCEOF。(如下图所示)

SATA协议Link <wbr>Layer链路层解析

5. Primitive基元

Primitive基元是用于控制和提供串行线状态的Dword实体。比如ALIGNp, SOFp, EOFp, HOLDp, PMREQ_Pp, PMREQ_Sp, SYNCp, WTRMp, R_RDYp, X_RDYp等。其对应的含义以及DW解析如下表:

SATA协议Link <wbr>Layer链路层解析

SATA协议Link <wbr>Layer链路层解析

SATA协议Link <wbr>Layer链路层解析


理论再多不如实践呐,现以设备接收一个资料包的传输过程来说明基元的作用。首先主机、设备都处于空闲状态(SYNC)

SATA协议Link <wbr>Layer链路层解析

(1) 主机有资料需要发送,发送X_RDY,通知设备准备接收资料;

SATA协议Link <wbr>Layer链路层解析

(2)设备检查自己的状态,准备好后发送R_RDY告诉主机可以发送数据;

SATA协议Link <wbr>Layer链路层解析

(3)主机开始发送资料, SOF为资料开始标志;

SATA协议Link <wbr>Layer链路层解析

(4)接收方在接收到资料时,以R_IP告诉主机正在接收资料;

SATA协议Link <wbr>Layer链路层解析

(5)主机的资料包没有发送完,可是还有些资料没有准备好,以HOLD告诉设备暂停资料发送;

(6) 设备接收到HOLD后,以HOLDA回应;

(7) 主机准备好了资料可以继续发送,以HOLD结束等待状态;

(8)主机继续传输资料;

(9)设备接收资料,以R_IP告诉主机正在接收资料;

SATA协议Link <wbr>Layer链路层解析

(10) 主机发送完了整个资料包,发送WTRM告诉设备:主机正在等待传输结果;

SATA协议Link <wbr>Layer链路层解析

(11) 设备接收完整个资料包并检验正确,以R_OK告诉主机接收正确;

SATA协议Link <wbr>Layer链路层解析

(12)主机进入空闲状态,发送同步信号SYNC;

SATA协议Link <wbr>Layer链路层解析

(13)设备进入空闲状态,发送同步信号SYNC;

SATA协议Link <wbr>Layer链路层解析



更多内容,请关注微信公众号:存储随笔,ID: Memory-logger,

SATA协议Link <wbr>Layer链路层解析

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有