一、SATA物理层概述

说OOB之前,首先得了解一下SATA结构以及物理层的含义。

SATA主要包括:应用层(Application Layer), 传输层(Transport Layer),链路层(Link Layer)、物理层(Physical Layer)。

SATA结构如下图:

这四个主要部分的作用是什么呢?

Application Layer/Command Layer(可解读为同一层) :

1. 最高层级的Layer,进行ATA或ATAPI command的执行,

2. implementation上很多是用软件处理.

Transport Layer (传输层):

1. 将Application Layer要做的Command转化成FIS的handshake,

2. 对FIS的组成和解开.

Link Layer (数据链路层):

1. 将要打出去的data做编码, 将收进来的data做解码,

2. 维持Link Layer的handshake机制.

Physical Layer (物理层):

1. Tx和Rx串行流(serial stream),

2. 上电时序,

3. 支持SATA电源管理选项,

4. OOB(Out-of-Band)信号的产生与检测.

从上面的介绍中,我们看到物理层中有一个关键的功能就是OOB(Out-of-Band)信号的产生与检测, 这就是我们今天的主角~

二、OOB(Out of Band)信号

SATA信号链接的建立主要是靠OOB(Out Of Band)的检测实现的,并且向上层Link Layer提供了物理层的链接情况。

OOB主要的作用包括以下几点:

  1. 初始化(initialization)

  2. 传输速率的协商与对接(Speed negotiation) --- 通过OOB handshake,host与device可以决定要在Gen1,Gen2,Gen3做data传输

  3. 重置(Reset)

  4. 从省电状态(Slumer/Partial)的唤醒

OOB信号实际上主要有COMRESET/COMINIT与COMWAKE。

  1. COMRESET:Host对Device进行硬件重置以及SATA信号的重新建立。

  2. COMINIT:由Device送往Host,要求信号初始化。

  3. COMWAKE:Host或是Device装置可以激发该信号来将PHY从省电状态(Slumer/Partial)抽离。

COMRESET/COMINIT由两部分相互间隔构成,一部分是突发长度为160个UI (Unit Interval)约106.7ns的ALIGN,另一部分是长度为480UI约320ns的Idle。

需要注意的是,虽然COMREST和COMINIT形式上是一样的,但COMREST只能从host到device,而COMINIT只能从device到host。

COMWAKE同样是有两部分相互间隔组成,一部分是突发长度为160个UI (Unit Interval)约106.7ns的ALIGN,另一部分是长度为160个UI约106.7ns的Idle。

SATA信号通迅链结建立过程是什么?

我们一步步的来解析一下详细的过程:

  1. 首先,主机重置,发出COMREST。

  2. 设备检测到COMRESET后以COMINIT回应。

    ---COMINIT为重新连接开始信号,设备可以在任意时间发送COMINIT重新建立连接。

  3. 若没有COMINIT的通知,HOST就会重复步骤1,直到DEVICE回复为止,这也是系统允许热插拔的关键。

  4. 主机calibrate(校准/标定),发出COMWAKE。

  5. 设备接收到COMWAKE后,设备连续发送6个COMWAKE信号,接着连续发送ALIGN进行传送速度的协商。

  6. 主机锁存资料。主机接收到COMWAKE后,以支援的最低速率连续发送D10.2资料,同时锁存检测接收的资料,当检测到设备发送的ALIGN后,以接收的速率将ALIGN转发给设备。

    注:D10.2是0101010101...这样0和1交替的波形, 可以让device端更容易做clock recovery的动作.

  7. 主机在发送了COMWAKE后至少要在880ps内接检测到ALIGN,否则主机重启上电序列重新检测设备,直到应用层将其终止。

  8. 设备锁存资料,检测到ALIGN后发送同步信号SYNC,通讯建立成功,进入到正常操作模式。如在54.6us内未检测到ALlGN,则进入错误处理,等待重新连接。

  9. 当主机接收到三个非ALIGN后,链结建立完成,进入正常操作

Device与Host连接是首先从Device支持的最高速开始的,如果最高速不满足则用较低速率再次匹配,直到最低速率也不能匹配后Device将进入error状态; 换速等待时间为54.6us(2048个ALIGN DWORD传输时间);

三、实例分享

我们来看个小编工作中遇到的一个实例--fail现象是正常上电之后SATA SSD无法被识别。

抓取正常上电之后fail sample SATA trace如下:

从上面的SATA trace结合前面SATA通讯链路建立的9个步骤,我们可以发现第六步之后就出问题了:

Device传送最高速度(6.0G)的Align无法顺利被SATA analyzer解析出来,再降速送Align(3.0G, 1.5G)依然无法被SATA analyzer解析, host也没有回应, speed negotiation失败。最终,Host再次发送COMRESET,进入死循环。

正是由于SATA信号通讯链路无法建立,导致SATA SSD在上电之后始终无法被识别到。

最后附上SSD可以被正确识别的SATA trace供各位看官参考:

SATA学习笔记——OOB信号的更多相关文章

  1. Linux学习笔记19——信号2

    上一节中讲到了sigprocmask函数,它的作用是检查或修改它的进程信号掩码,这一节我们主要学习捕捉与忽略信号的函数sigaction和等待信号函数. 一  sigaction函数的作用 定义在接收 ...

  2. Linux学习笔记18——信号1

    一 信号的基本概念 信号:是向进程发送的软件通知,通知进程有事件发生. 生成:表示一个信号的产生. 捕获:表示接收到一个信号. 信号的寿命:信号的生成和传递之间的时间间隔. 挂起的信号:已经生成但还未 ...

  3. openrisc 之 Wishbone总线学习笔记——接口信号定义

    这部分内容就是copy下来的,网上到处都有.先看看接口啥样子,在详细说明 接口定义copy http://blog.csdn.net/ce123/article/details/6929897.百度文 ...

  4. [学习笔记&教程] 信号, 集合, 多项式, 以及各种卷积性变换 (FFT,NTT,FWT,FMT)

    目录 信号, 集合, 多项式, 以及卷积性变换 卷积 卷积性变换 傅里叶变换与信号 引入: 信号分析 变换的基础: 复数 傅里叶变换 离散傅里叶变换 FFT 与多项式 \(n\) 次单位复根 消去引理 ...

  5. APUE学习笔记——10信号——信号接口函数 signal 和 sigaction

    signal函数     signal函数是早起Unix系统的信号接口,早期系统中提供不可靠的信号机制.在后来的分支中,部分系统使用原来的不可靠机制定义signal函数,如 Solaris 10 .而 ...

  6. APUE学习笔记——10 信号

    信号的基本概念     信号是软件中断,信号提供了解决异步时间的方法.     每一中信号都有一个名字,信号名以SIG开头. 产生信号的几种方式     很多条件可以产生信号:     终端交互:用户 ...

  7. linux 进程学习笔记-进程信号sigal

    信号(或软中断)是在软件层次上对中断的一个模拟,其运行在“用户空间”,一个进程对另外一个或几个进程通过发送信号来实现异步通信.当接收进程接收到信号后,其可以注册一下处理函数来说对这些信号进行处理(也可 ...

  8. Linux System Programming 学习笔记(十) 信号

    1. 信号是软中断,提供处理异步事件的机制 异步事件可以是来源于系统外部(例如用户输入Ctrl-C)也可以来源于系统内(例如除0)   内核使用以下三种方法之一来处理信号: (1) 忽略该信号.SIG ...

  9. APUE 学习笔记(七) 信号

    1.信号是软件中断,提供一种异步处理事件的方法 很多事件产生信号: (1)用户按下某些中断键,如 Ctrl + C键产生 SIGINT信号 (2)硬件异常产生信号,比如 除数为0,无效的内存引用  ( ...

  10. APUE学习笔记5——信号、信号集和进程信号屏蔽字

    1 信号传递过程 当引发信号的事件发生时(如软硬件异常.软件定时.终端产生信号或调用kill函数等等),会产生信号,内核会发送给目标进程. 在信号产生到信号传递给目标进程之间的时间间隔内,称该信号为未 ...

随机推荐

  1. ElasticSearch使用实践(文档操作)

    可以使用Docker安装ES和Kibana: 使用docker-compose安装ElasticSearch和Kibana: version: '3.1' services: elasticsearc ...

  2. c#下使用WM_COPYDATA

    [DllImport("User32.dll")] public static extern int SendMessage(IntPtr hwnd, int msg, int w ...

  3. blender 3D 汽车模型下载

    前言 因为之前需要模拟摄像头拍摄汽车车牌,从各种途径下载了一些blender 3D 汽车模型,现将模型分享出来,如有需要,直接去最后面下载地址下载即可 目前已经车型40多款 车型图 70年代Porsc ...

  4. linux环境C语言实现:h264与pcm封装成AVI格式

    ​ 前言 拖了很久的AVI音视频封装实例,花了一天时间终于调完了,兼容性不是太好,但作为参考学习使用应该没有问题. RIFF和AVI以及WAV格式,可以参考前面的一些文章.这里详细介绍将一个H264视 ...

  5. cri-docker的学习和了解-番外

    cri-docker的学习和了解-番外 前言 因为已经有足足两年多没再详细接触K8S了. 然后利用两个晚上搭建了IPV6 SingleStack的K8S单机版 中间一直使用的docker的方式学习和工 ...

  6. [转帖]shell编程之条件语句

    目录 一.条件测试 test命令 文件测试与整数测试 文件测试 整数值比较 字符串测试与逻辑测试 字符串比较 逻辑测试 二.if语句 if单分支语句 单分支结构 if双分支语句 双分支结构 if多分支 ...

  7. [转帖]OJDBC版本区别 [ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别]

    classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别,之间的差异 在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle  ...

  8. 【转帖】如何使用route管理路由表

    这里是引用 route快捷使用方法 我们一般管理路由有使用route命令 本身route使用大致有两种方法:但其实 在实际操作中,我们熟练掌握一种方法就可以了. route 有以下6种操作方法: 1) ...

  9. [转帖]Spring Cloud 整合 SkyWalking

    https://www.jianshu.com/p/e81e35dc6406 Java Agent 服务器探针 探针,用来收集和发送数据到归集器.参考官网给出的帮助 Setup java agent, ...

  10. 程序启停分析与进程常用API的使用

    进程是程序运行的实例,操作系统为进程分配独立的资源,使之拥有独立的空间,互不干扰. 空间布局 拿c程序来说,其空间布局包括如下几个部分: 数据段(初始化的数据段):例如在函数外的声明,int a = ...