SGPIO(Serial General Purpose Input Output)
使用背景
这个东西是用来给存储系统设置的一种协议,通信双方分别是**存储控制器(HBA、RAID卡)**作为Master 和SATA/SAS硬盘背板(Backplane),标准定义于SFF-8485
为什么需要这个东西?
假如存储控制器下有16张硬盘,每一张硬盘都需要实时的反馈一个状态来供工程师知晓,这个状态通过三个LED(运行ACT、故障FAIL、定位LOCATE)
那么每张磁盘就需要三个IO,16张就是48个IO,对于控制器来说:
控制器 ├──GPIO1 → HDD1 ACT ├──GPIO2 → HDD1 FAIL ├──GPIO3 → HDD1 LOCATE ... ├──GPIO48 → HDD16 LOCATE几乎不可接受。
于是设计了SGPIO。
变成:
Controller │ │4根线 │ Backplane │ ├──LED1 ├──LED2 ├──LED3 ├──... └──LED16现在只需要四根线就可以控制这48个LED了,相当于控制器大老板通过SGPIO协议将点灯这种低层次活外包给了背板这个牛马
引脚定义
SGPIO只有四根线:
SClock
串行时钟 作用:告诉背板:"现在开始采样数据。 电平 低----->高------>低 表示一个时钟周期 背板需要在上升沿触发上升沿中断读数据
很多人会理解成:
SCLK拉高的时候发送的是SOUT
根据SFF-8485标准,Slave设备需要在读取数据窗口中读取的不仅仅是SOUT的数据,还有SLOAD的数据
每一个SCLK上升沿,Slave都会同时读取两根线:
读取SLOAD 读取SOUT为什么需要这样?如果仅仅使用SLOAD一根线在进行帧同步,那么Slave设备实际上只知道SOUT的变化时间,而在SLOAD发送帧同步信号的时候,它是什么时候变化的,该在帧的哪个位置进行切割?没有人说的清
SLoad
SLoad 是帧同步信号,由 Master(启动设备)发出。它的作用是通过一个时钟周期的高电平告诉 Slave:“当前这一拍是当前帧的最后一个 bit,紧接着会进入供应商特定数据,然后开始新的一帧。”
SOUT
这根线发送的数据主要是控制器将状态数据发送出来以便于背板上的Slave设备控制显示每个硬盘的状态(包含前文说过的运行、故障和定位)
SDataIn
SDataIn 信号携带与目标背板上硬盘驱动器有联系的输入位,每个硬盘同样有三个输入位,但是Master设备可以支持这个信号的解析也可以不支持,对于不支持这个的Master设备会直接忽略掉这个信号
传输过程和实现方式
每帧传输结束后,Master 在帧的最后一个时钟周期将 SLoad 拉高,Slave 在 SCLK 上升沿采样到 SLoad=1 就知道这一帧结束了。每次新帧发送拉高电平后随后 Master 紧接着SLOAD发送 4 bit 供应商特定数据(L0–L3,规范定义,非厂商随意),发完后 SLoad 拉低。等下一次 SLoad 拉高时就是新一轮位流的开始,Slave 内部从头计数。
解析时注意:帧尾的 SLoad=1 和新帧开始的 SLoad=1 不是一回事——中间隔了 L0–L3 共 4 个时钟周期,要正确跨越后再把下一个 SLoad=1 判为新帧起始。