FIS(Frame Information Structure)解析
FIS是一种用于Host和device之间信息传输的机制,每个FIS的格式都是固定的,并且对应唯一的ID,SATA Spec定义了14类FIS ID。
但是,实际上,我们用到主要是8类:
FIS Type | FIS ID | Discription | Size |
H2D | 27h | Send command to drive | 5 DWs |
D2H | 34h | Responds status to host | 5 DWs |
DMA Activate | 39h | Activate a DMA data transfer | 1 DW |
DMA Setup | 41h | Start a DMA data transfer | 7 DWs |
PIO Setup | 5Fh | Start a PIO transfer PIO=Programmed Input/Output | 5 DWs |
DATA | 46h | Data packet | 2049 DWs |
SDB | A1h | Responds a command completion for NCQ command | 2 DWs |
BIST | 58h | SATA Built-In Self-Test | 3 DWs |
(1) Register FIS-H2D(27h)
用来传输主机的Shadow Register(可以理解为CPU的传达室)的资料到设备,与ATA/ATAPI指令字和寄存器相容。
当Device接收到一个有效的Register FIS - H2D,检查C bit的内容,然后更新命令寄存器 / 控制寄存器中的内容中,
C bit为‘1’,Device按照Command Register中的命令执行命令,
C bit为‘0’,Device按照Control Register中的内容执行控制请求。
(2) Register FIS-D2H(34h)
D2H的作用如下:
从Device送往Host端,传送装置的状态变化。
当Device完成一个命令,向主机报告指令完成的状态。
Device用于修改host中shadow block里的command register和control register。
(3) SDB(Set Device Bits)(A1h)
SDB的作用是Device用来改写host 的shadow register中的error或status的某些bits;
这些bits包括Error全部8 bits和Status中的6 bits,
SDB FIS不改变状态寄存器中的bit7 BSY(Busy)、bit3 DRQ(Data Request)。
下表中的“i”表示host在收到该FIS以后,如果shadow status register中BSY和DRQ位都为0时,host进入中断等待状态(实际上表明device进入中断等待状态)
(4) DMA Activate(39h)--Device to Host
DMA Active FIS的特性主要是:
Device发送该FIS同意主机以DMA方式向设备发送资料,
是Device对主机DMA写命令的一个回应,
当发送完FIS后,Device必须进入接收DMA资料接收状态,
每发送一个DMA DATA FIS后,要再次收到DMA Activate FIS才能发送下一个DMA DATA FIS;
(5) DMA Setup(41h)--Bidirectional
进行DMA操作的第一步,目的是为了建立DMA操作参数。
发送方通过发送这个FIS,要求对方配置好DMA控制器,同时存储空间必须按要求处于准备状态。
D bit为‘0’,代表发送方传送资料;
D bit为‘1’,代表接收方传送资料, 传输时一方的D为1,另一方的D为0。
DMA Transfer Count表示传输Bytes计数。
(6) PIO Setup(5Fh)--Device to Host
由设备发送给主机,告诉主机相关PIO操作参数,包括了在PIO传输前和传输后shadow register的内容。
在PIO传输资料的过程中,Device必须先发送这个FIS给主机,表示Device准备好发送或接受数据。
与DMA传输一样,每传一个DATA FIS就要一个PIO SETUP FIS传输下一个DATA FIS;
(7) DATA FIS(46h)--Bidirectional
DATA FIS比较简单,就是用来传输资料,比如说对硬盘的读写操作,
资料包的长度是不定的,除去SOF、EOF、CRC和FIS类型等标志外,最多2048个Dwords。
(8) BIST Activate(58h)--Bidirectional
让对方进入测试模式,是一个双向可用的FIS,接收方以R_OK回应,完成测试工作之后就进入BIST交换状态了。