
SGPIOSerial General Purpose Input Output使用背景这个东西是用来给存储系统设置的一种协议通信双方分别是**存储控制器HBA、RAID卡**作为Master 和SATA/SAS硬盘背板Backplane,标准定义于SFF-8485为什么需要这个东西假如存储控制器下有16张硬盘每一张硬盘都需要实时的反馈一个状态来供工程师知晓这个状态通过三个LED(运行ACT、故障FAIL、定位LOCATE)那么每张磁盘就需要三个IO16张就是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发送帧同步信号的时候它是什么时候变化的该在帧的哪个位置进行切割没有人说的清SLoadSLoad 是帧同步信号由 Master启动设备发出。它的作用是通过一个时钟周期的高电平告诉 Slave“当前这一拍是当前帧的最后一个 bit紧接着会进入供应商特定数据然后开始新的一帧。”SOUT这根线发送的数据主要是控制器将状态数据发送出来以便于背板上的Slave设备控制显示每个硬盘的状态包含前文说过的运行、故障和定位SDataInSDataIn 信号携带与目标背板上硬盘驱动器有联系的输入位,每个硬盘同样有三个输入位但是Master设备可以支持这个信号的解析也可以不支持对于不支持这个的Master设备会直接忽略掉这个信号传输过程和实现方式每帧传输结束后Master 在帧的最后一个时钟周期将 SLoad 拉高Slave 在 SCLK 上升沿采样到 SLoad1 就知道这一帧结束了。每次新帧发送拉高电平后随后 Master 紧接着SLOAD发送 4 bit 供应商特定数据L0–L3规范定义非厂商随意发完后 SLoad 拉低。等下一次 SLoad 拉高时就是新一轮位流的开始Slave 内部从头计数。解析时注意帧尾的 SLoad1 和新帧开始的 SLoad1 不是一回事——中间隔了 L0–L3 共 4 个时钟周期要正确跨越后再把下一个 SLoad1 判为新帧起始。