ufs2.2 协议扫盲(十七)

13 UFS FUNCTIONAL DESCRIPTIONS

13.1 UFS Boot
13.1.1 Introduction
一些计算系统可能需要从外部非易失性源,下载系统引导加载程序。 该任务可以通过包含在主机 SOC 中的内部引导 ROM 来完成,其代码在执行时确定系统的最小初始化以启动引导代码传输。可以配置引导功能的几个特性以适应不同的系统要求。 此外,还定义了确保引导数据完整性和引导代码不损坏的特定功能。
13.1.2 Boot Configuration
1、在引导操作期间,UFS 主机控制器检索存储在 UFS 设备中的系统引导代码。两个逻辑单元(Boot LU A、Boot LU B)可用于存储引导代码,但在引导过程中只有一个逻辑单元处于活动状态。 任何逻辑单元都可以配置为“Boot LU A”或“Boot LU B”。 最多一个逻辑单元可以配置为“Boot LU A”,最多一个逻辑单元可以配置为“Boot LU B”。 在引导期间处于活动状态的逻辑单元被映射到
Boot well known logical unit(W-LUN = 30h) 以进行读取访问。 以这种方式,当活动逻辑单元从 A 交换到 B 时,当主机更新引导代码时,它保持一个 固定的逻辑单元编号,反之亦然。
 
2、设备描述符和单元描述符的几个可配置字段决定了启动期间的设备行为。 设备描述符和单元描述符是通过编写配置描述符来配置的。
 
3、对于 UFS 可引导设备,如果设备描述符中的 bBootEnable 字段设置为 01h,则启用引导功能。
4、启动时使用的逻辑单元的特性是通过设置Configuration Descriptor的相应字段来配置的
5、具体而言,分配单元的数量(dNumAllocUnits)字段配置逻辑单元大小,引导逻辑单元ID(bBootLunID)字段允许将逻辑单元指定为“引导LU A”或“引导LU B”。

6、引导期间活动的逻辑单元应通过写入 bBootLunEn 属性来配置,主机不应尝试将 bBootLunEn 设置为“保留”值,如果尝试设置“保留”值而不执行请求,UFS 设备应生成错误,当 bBootLunEn 属性为 00h 时,启动功能被禁用,设备的行为就像 bBootEnable 等于 0 ,一旦正确配置了 bBootLunEn,活动的引导逻辑单元将被映射到 Boot well known boot logic unit (W-LUN = 30h)。 :
ufs2.2 协议扫盲(十七)_第1张图片
7、下图显示了一个具有八个逻辑单元的 UFS 设备示例:LU 1 和 LU 4 分别配置为“Boot LU A”和“Boot LU B”。 特别是,LU 1 是活动的 (bBootLunEn = 01h)。
ufs2.2 协议扫盲(十七)_第2张图片
13.1.3 Initialization and boot code download process
初始化和引导代码下载过程由以下阶段组成:partial initialization, boot transfer and initialization completion
13.1.3.1 Partial initialization 
Partial initialization 
阶段在上电、硬件复位或 EndPointReset 后开始,涉及整个 UFS 堆栈。 在此阶段结束时,UniPro 启动序列应完成,UTP 层应能够访问设备描述符(如果设备描述符的 bDescrAccessEn 字段为'01h')并交换 UPIU 以获取 READ 命令和 TEST UNIT READY 命令。 如果 bDescrAccessEn 字段为“00h”,则只能在initialization completion阶段之后访问描述符。UFS 协议栈中的每一层都在 UFS 主机端和 UFS 设备端执行初始化过程。
a) Physical Layer (M-PHY)
在reset events之后,物理层将从 DISABLED 状态移动到 HIBERN8 状态。
b) Link Layer (UniPro)
在主机和设备端 UniPro 启动顺序发生:
1) UniPro 堆栈使用 DME_RESET.req 原语复位。
2) 等到 DME_RESET.cnf_L 原语指示复位完成。
3) UniPro 堆栈使用 DME_ENABLE.req 原语启用。
4) 等待直到 DME_ENABLE.cnf_L 原语指示启用完成。
5) UniPro Link StartUp 序列使用 DME_LINKSTARTUP.req 原语启动。 UniPro Link Startup 由一系列多阶段握手组成,以在 UFS 主机和设备之间建立双向的初始链路通信。
6) 等到链路启动完成由 DME_LINKSTARTUP.cnf_L 原语指示。

c) UFS Transport Layer (UTP)
在主机和设备端的 UFS 互连层初始化结束时,主机应发送 NOP OUT UPIU 以验证设备 UTP 层已准备好。对于某些实现方式,设备 UTP 层可能尚未初始化,因此设备可能不会及时响应 NOP OUT UPIU 并且发送 NOP IN UPIU。 主机一直等待,直到它从设备接收到 NOP IN UPIU。 当收到 NOP IN UPIU 时,主机确认设备上的 UTP 层已准备好执行 UTP 事务。
d) Link Configuration
主机可以使用 UniPro 级别的 DME 原语配置链路属性(即,Gear、HS 系列、Rx 和 Tx 中的 PWM 模式)。
e) Device Descriptor Reading
UFS 主机可以通过访问设备描述符(即,Device Class/Subclass, Boot Enable, Boot LUs size等)来选择性地发现引导过程的相关设备信息。 仅当 bDescrAccessEn 为“01h”时,UFS 主机才允许访问设备描述符,否则只有在设备完全完成初始化后才能访问此描述符。
13.1.3.2 Boot transfer
只有设置了 bBootEnable 字段才能执行以下步骤:
Boot code download
首先,UFS主机向Boot well known logical unit发出TEST UNIT READY命令,以验证后者是否可以访问。 如果命令成功,UFS 主机通过发出 SCSI READ 命令读取 Boot well known 逻辑单元,UFS 设备将开始在上行链路上发送引导代码。 在这个阶段,只有 Boot well known 逻辑单元可以访问:这个逻辑单元应该接受读取命令,而其他逻辑单元可能还没有准备好。
13.1.3.3 Initialization completion
主机从 Boot well known 逻辑单元完成引导代码下载后,初始化过程如下所述。 主机将 fDeviceInit 标志设置为“01h”以与 UFS 设备通信,表明它可以完成其初始化。 初始化完成后,设备应重置 fDeviceInit 标志。 主机轮询 fDeviceInit 标志以检查进程是否完成。 当 fDeviceInit 复位时,设备准备好接受任何命令。
初始化过程,流程图见协议,以下是文字版:
1、ufs设备中没有活动任务, UFS 描述符、属性和标志设置为其默认值 UniPro 属性重置
2、两边的M-PHY层初始化会导致PWM-G1 speed gear
3、
两边进行
UniPro Boot sequence and Attributes configuration
4、主机发送 NOP OUT UPIU。 设备以 NOP IN UPIU 响应
5、UFS host queries the UFS device Descriptor
bDeviceClass/bDeviceSubClass – Mass Storage Bootable Device
bBootEnable – Boot process enabled
bBootLunEn – LU configured for Boot
bBootSeqID – RFU

第5操作是可选的,仅当 bDescrAccessEn 等于 1 时才允许。
6、主机发出 TEST UNIT READY 以检查 Boot W-LU 是否可操作。 如果主机不读取 Boot W-LU,则此操作是可选的,在设备向主机报告 UNIT ATTENTION with CHECK CONDITION 状态后,设备将清除已建立的 UAC。
7、主机通过发出一个或多个 SCSI READ 命令从 Boot well known 逻辑单元读取引导代码
8、Query Request (SET FLAG fDeviceInit)主机通过设置 fDeviceInit 标志使设备初始化完成。
9、fDeviceInit 标志由主机轮询以验证设备初始化是否完成。 在初始化过程结束时,fDeviceInit 应由设备复位。

 13.1.5 Boot Logical Unit Operations

The Boot well known logical unit is read only, therefore the boot code can be stored only writing the boot logical units (A or B).

引导逻辑单元在系统制造阶段被写入以存储引导代码,并且它们也可能在系统生命周期中被更新。 可以读取这些逻辑单元以验证其内容。
Therefore the following operations are permitted on the Boot logical units:
1. boot code write – for boot code upload/update
2. boot code read –
to verify the content programmed
3. boot code removal – to remove the content of the Boot logical unit

无论设备描述符中的 bBootEnable 字段值如何,都可以执行这些操作。引导逻辑单元(A 或 B)可以使用 12.3, 设备数据保护中描述的方法进行写保护。

13.1.7 Security
13.1.7.1 Boot Area Protection
引导区域可能会受到保护,以避免第三方更改引导代码:引导逻辑单元的写保护机制可以通过配置单元描述符的相应 bLUWriteProtect 参数来定义。 特别地,引导逻辑单元可以被永久写保护或通电写保护。 在上电写保护的情况下,只有当 fPowerOnWPEn 标志等于 0 时,才能写入引导逻辑单元。

你可能感兴趣的:(UFS,linux,c语言,驱动开发,架构,C)