目录
七、UPIU介绍
UFS协议信息单元(UPIU)是UFS协议中用于数据传输的基本单元,它具有固定的格式,并且包含了传输命令或请求所需的所有信息。
在UFS中,UPIU的作用类似于SATA(串行ATA)中的FIS(Frame Information Structure,帧信息结构)和PCIe(PCI Express)中的TLP(Transaction Layer Packet,事务层数据包)。这些结构都是各自协议中用于传输数据的基本单元,它们封装了命令、数据和状态信息,以确保数据传输的准确性和效率。
-
SATA中的FIS:在SATA协议中,FIS用于在主机和存储设备之间传输命令和数据。FIS有不同的类型,每种类型用于不同的传输目的,例如,读/写命令、设备状态等。
-
PCIe中的TLP:PCIe是一个高速串行通信协议,用于计算机内部硬件之间的数据传输。TLP是PCIe协议中的基本数据传输单元,它包含了传输的数据和必要的控制信息。
在UFS(Universal Flash Storage)协议中,命令的执行通常分为三个阶段:命令阶段、数据阶段和状态阶段。每个阶段都有其特定的作用和重要性。以下是对这三个阶段的进一步解释:
1、命令阶段(Command Phase):
- 主机向设备发送命令或请求。这个阶段是命令执行过程的起点,主机通过发送命令来指示设备执行特定的操作,如读取、写入、擦除等。
2、数据阶段(Data Phase):
- 根据命令的性质,这个阶段可能涉及到数据的传输。对于读写命令,数据阶段是必要的,因为它们需要在主机和设备之间传输数据。然而,对于某些不需要数据交换的命令,如某些配置或状态查询命令,数据阶段可能不存在。
3、状态阶段(Status Phase):
- 无论命令是否涉及数据传输,状态阶段都是必不可少的。在这个阶段,设备向主机返回命令执行的结果,包括成功、失败或错误状态。这确保了主机能够了解命令的执行情况,并据此采取进一步的行动。
在PCIe(PCI Express)协议中,事务层数据包(TLP)可以是Posted或Non-posted:
Posted TLP:
- Posted TLP用于不需要确认的事务,即发起者不等待命令执行状态的返回。这通常用于那些不需要立即反馈的事务,可以提高系统的整体性能。
Non-posted TLP:
- Non-posted TLP用于需要确认的事务,即发起者需要等待命令执行状态的返回。这确保了事务的完整性和可靠性。
对于UFS来说,所有的命令都是Non-posted的,这意味着设备必须在命令执行完成后向主机返回状态信息。这种机制确保了命令的执行是可追踪和可靠的,对于存储设备来说尤其重要,因为数据的完整性和准确性至关重要。
八、UPIU详解
在UFS(Universal Flash Storage)协议中,UPIU(UFS Protocol Information Unit)是用于主机和设备之间信息交互的基本单元。无论命令执行处于哪个阶段,UPIU都发挥着关键作用。以下是UPIU在不同阶段的具体应用:
1、命令或请求UPIU:
- 当UFS主机需要向设备发送命令或请求时,它会创建一个命令或请求UPIU。这个UPIU包含了命令的详细信息,如命令码、传输参数等,以及可能需要的额外信息,如事务标识符(Transaction Identifier,TID)。
2、数据UPIU:
- 在数据阶段,如果命令涉及到数据的传输,UFS主机或设备会使用数据UPIU来传输数据。数据UPIU包含了实际的数据负载,以及与数据传输相关的控制信息,如数据长度、方向(主机到设备或设备到主机)等。
3、响应UPIU:
- 在状态阶段,UFS设备使用响应UPIU来向主机返回命令执行的状态信息。响应UPIU包含了命令执行结果的状态码,指示命令是否成功完成,或者是否遇到了错误。
在整个命令执行过程中,UPIU确保了信息的封装和传输的一致性。通过使用UPIU,UFS协议能够以标准化的方式处理命令、数据和状态信息,从而简化了主机和设备之间的通信过程,并提高了协议的效率和可靠性。
此外,UPIU的使用还有助于实现以下目标:
- 错误检测和纠正:UPIU可能包含用于错误检测和纠正的机制,如校验和或CRC(循环冗余校验)。
- 命令队列管理:UPIU中的TID可以帮助UFS主机和设备有效地管理命令队列,确保命令按照正确的顺序执行。
- 协议兼容性:UPIU的设计有助于确保UFS协议的兼容性,使得不同的UFS设备和主机能够无缝地进行通信。
(1)命令或者请求UPIU
在UFS(Universal Flash Storage)系统中,应用层的命令、设备管理和任务管理是三个关键的模块,它们与传输层紧密协作以实现高效和灵活的数据存储和访问。以下是这些模块如何与传输层交互,以及传输层如何生成不同类型的UPIU(UFS Protocol Information Unit):
1、UFS命令模块:
- 这个模块负责发送简化版本的SCSI(Small Computer System Interface)命令。SCSI是一种广泛使用的存储设备接口标准,UFS命令模块使用这些命令来执行存储操作,如读写数据块。
- 当传输层接收到来自UFS命令模块的命令请求时,它会生成一个COMMAND UPIU。这个UPIU封装了SCSI命令的所有相关信息,包括操作码、参数列表、数据传输方向和大小等。
2、任务管理器:
- 任务管理器负责管理任务队列,包括任务的调度、优先级管理以及执行终止(Abort)操作。它允许应用层控制和监视正在进行的命令。
- 当传输层接收到来自任务管理器的请求,如终止某个正在进行的命令,它会生成一个TASK MANAGEMENT REQUEST UPIU。这个UPIU封装了任务管理请求的详细信息,包括要终止的命令的标识符和请求的类型。
3、设备管理器:
- 设备管理器负责管理UFS设备的配置和状态,包括设置设备参数、查询设备状态和执行固件更新等操作。
- 当传输层接收到来自设备管理器的请求,如查询设备的配置信息,它会生成一个QUERY REQUEST UPIU。这个UPIU封装了设备管理请求的所有相关信息,包括查询的类型和所需的参数。
每种类型的UPIU都是为特定类型的请求设计的,确保了命令和请求的准确传递以及数据的完整性和可靠性。通过这种方式,UFS协议能够支持复杂的存储操作和管理功能,同时保持高效和灵活的数据处理能力。
(2)数据传输相关UPIU
在UFS(Universal Flash Storage)协议中,数据的传输是双向的,并且需要主机和设备之间的协调。
1、数据传输机制
(1)写操作(Write Operation):
- 命令阶段:主机首先发送写命令给设备。
- 等待阶段:主机等待设备通知其准备好接收数据。
- 通知阶段:设备通过发送READY TO TRANSFER UPIU(RTT)告知主机它已准备好接收数据,以及可以接收的数据量。
- 数据传输阶段:主机根据RTT中的信息,发送DATA OUT UPIU将数据传输给设备。
(2)读操作(Read Operation):
- 命令阶段:主机发送读命令给设备。
- 数据准备阶段:设备从闪存中获取数据。
- 数据传输阶段:设备控制数据的传输,通过DATA IN UPIU将数据发送给主机。主机在发送读命令之前已准备好接收数据的空间。
2、主机和设备的角色
-
主机(Host):
- 在写操作中,主机是数据的发送者,需要等待设备的RTT通知后再发送数据。
- 在读操作中,主机是数据的接收者,等待设备准备好数据后接收。
-
设备(Device):
- 在写操作中,设备是数据的接收者,需要在准备好接收数据后发送RTT给主机。
- 在读操作中,设备是数据的发送者,控制数据的传输给主机。
UFS协议中的这种机制确保了数据传输的同步性和效率。主机在写操作中不会盲目发送数据,而是等待设备的准备通知,这有助于避免数据传输冲突和提高数据传输的可靠性。而在读操作中,由于主机已经准备好接收数据,设备可以直接控制数据的发送,从而实现高效的数据传输。
(3)状态UPIU
针对UFS(Universal Flash Storage)系统中主机发出的不同请求,设备在完成任务后会返回相应的状态UPIU给主机。
1、主机请求与对应的状态UPIU
(1)SCSI命令
- 请求类型: SCSI命令,用于执行存储操作,如读写数据。
- 返回状态UPIU: RESPONSE UPIU,包含SCSI命令执行的状态和结果。
(2)任务管理器发出的Task Management Request
- 请求类型: Task Management Request,用于管理命令队列,如终止或查询命令。
- 返回状态UPIU: TASK MANAGEMENT RESPONSE UPIU,包含任务管理操作的状态和结果。
(3)设备管理器发出的Query Request
- 请求类型: Query Request,用于查询或配置UFS设备的状态和参数。
- 返回状态UPIU: QUERY RESPONSE UPIU,包含查询操作的状态和结果数据。
2、状态UPIU的作用
- RESPONSE UPIU: 用于通知主机SCSI命令的执行结果,包括成功、错误或状态信息。
- TASK MANAGEMENT RESPONSE UPIU: 用于通知主机任务管理操作的结果,例如命令是否已成功终止或查询。
(4)其它UPIU
1、特殊UPIU类型及其作用
(1)NOP OUT UPIU
- 传输方向: 主机到设备
- 作用: 无操作命令,用于检测设备是否连接并响应。类似于网络中的ping命令,用于确认连接的可达性。
(2)NOP IN UPIU
- 传输方向: 设备到主机
- 作用: 作为NOP OUT UPIU的响应,表明设备已经收到NOP OUT UPIU并正常响应,主机可以确认与设备的连接。
(3)REJECT UPIU
- 传输方向: 设备到主机
- 作用: 当设备接收到一个无效或不被支持的UPIU时,会发送REJECT UPIU来拒绝该UPIU,通知主机该命令或请求不被接受。
2、特殊UPIU的使用场景
- NOP OUT UPIU: 主机在初始化或定期检查时发送,以确保设备仍然在线并能够响应命令。
- NOP IN UPIU: 设备收到NOP OUT UPIU后返回,用于确认设备的正常工作状态和响应能力。
- REJECT UPIU: 设备在遇到无法处理的UPIU时使用,以通知主机存在问题,需要主机采取相应的措施。
九、读写交互实例
主机往设备读取96KB数据
主机往设备读取96KB数据:
命令发送:主机通过某种通信协议(如TCP/IP)向设备发送一个读数据的命令。在这个例子中,命令是读取96KB的数据。
数据传输:设备接收到命令后,开始准备数据。由于数据量较大,设备可能选择分批次传输数据,以避免数据传输过程中的延迟和丢包问题。在这个例子中,数据被分为三批返回。
状态返回:数据传输完成后,设备会发送一个状态消息给主机,告知命令的执行结果。这个状态可以是成功、失败或其他状态信息,具体取决于设备和协议的设计。
主机往设备写64KB数据
主机往设备写64KB数据:
基于请求-响应模式的数据传输过程,其中涉及到了轮询(Polling)和确认(Acknowledgment,简称ACK)机制。这个过程通常被称为"停止-等待"协议(Stop-and-Wait Protocol),在这种协议中,发送方在发送数据后会等待接收方的确认,然后才继续发送下一批数据。
命令发送:主机发送一个写64KB数据的命令给设备。
等待响应:主机等待设备响应,确认设备已经准备好接收数据。
数据分批传输:
- 设备通知主机可以开始传输数据,指定可以传输24KB。
- 主机收到通知后,发送24KB数据给设备。
- 设备接收到24KB数据后,发送确认(ACK)给主机,通知主机可以继续发送下一批数据。
- 设备再次通知主机,可以发送32KB数据。
- 主机收到通知后,发送32KB数据给设备。
- 设备接收到32KB数据后,再次发送确认给主机。
传输剩余数据:
- 设备通知主机可以发送剩余的8KB数据。
- 主机收到通知后,发送剩余的8KB数据给设备。
确认完成:
- 设备接收到所有数据后,对数据进行处理,并发送一个命令执行完成的响应给主机。
主机接收响应:主机接收到设备发送的命令执行完成的响应,确认整个数据传输过程已经成功完成。
在这个过程中,"RTT"(Round-Trip Time,往返时间)是指从主机发送数据到设备,再从设备返回确认的总时间。主机必须等待收到设备的确认(即一个RTT周期)后,才能继续发送下一批数据。这种机制确保了数据的可靠传输,但同时也降低了传输效率,因为主机在每次数据传输后都需要等待确认,这增加了传输的总时间。
在实际应用中,为了提高效率,可能会使用更高级的协议,如TCP,它支持流水线传输(Pipelining),允许在没有收到确认的情况下发送多个数据包。然而,对于某些实时性要求高或资源受限的系统,停止-等待协议可能是一个合适的选择。