UFS的初始化过程(二)

这篇是接着上一篇的UFS 的Init过程(一)来写的。

我们先回顾一下在UFS 的Init过程(一)优快云 中这张重要的图。

这里我们思考下,NOP OUT是UFS层面发出去的第一个握手动作。 Host在发送这个NOP OUT的时候,是不是要保证uni-pro

和M-PHY层链路的通畅?

所以,在NOU OUT之前,host和device之前应该有更底层的握手动作,这个过程我们称为link startup.那么,把上面的图稍作修正,如下。

这一篇我们就重点说Uni-pro层的link startup 过程。大家可以参考协议mipialliance specification for Unified Protocol version1.6的section 5.6.3和section5.7.8.

Link startup的过程包含以下phase.

可能乍一看不知道是在干什么,没关系我们慢慢来,每一个phase是在做什么。

1. Phase0 and Phase0b(Data lane discovery)

顾名思义,这个阶段的主要作用就是让host和device都discover一下对方用了哪几个lane.过程可以参考下图。

以上图为例,在上电之后,我们把host和device想象成黑暗中的两个人,他们看不见对方,所以也不知道对方用几个lane。

host TX: 我用的是PL#3和PL#2,所以就通过PL#3和PL#2分别发1个TRG_UPR0,携带lane number 11和10。

device RX:在黑暗中等待,忽然间两个RX收到了TRG_UPR0,分别是11和10. 哦,原来host用的是PL#3 和 PL#2. 那我赶紧在PeerTxConnectedLaneMask 上标记一下1100。

device TX: 我也发TRG_UPR0告诉host 我用的是PL#2吧。

host RX: 终于等到回复的TRG_UPR0了,哦~原来device用的是PL#2,那我也记录在PeerTxConnectedLaneMask上0100。

以上过程完成以后,按照规定,hostTX和deviceTX都要额外再发两个TRG_UPR0。

至此,phase0,0b就完成了。需要注意的一点是,UPR0有可能是host先发也有可能是device先发送。

2. Phase1 and 2(Data Lane Realignment)

phase1,2的过程主要是两端realign lane no.

可能你会奇怪,lane的信息在phase0b不是已经确认了吗,为什么这里还需要realign?好,再回忆一下,host TX告诉device它用的是lane2.3,device记录下来。那问题是,host不知道device记录了什么,记录的是否正确,这就是为什么还需要realign。

host TX: 我发TRG_UPR1来告诉device我记录的PeerTxConnectedLanesMask = 0100

device RX: 收到了,我就记录在LocalConnectedLanedMask = 0100。 并且配置两个logical lane =  LL#0 & LL#1

device TX: 我也要把自己记录的PeerTxConnectedLanesMask = 1100 发给host.

host RX:收到了,就记录在LocalConnectedLanedMask = 1100吧, 还要配置下logical lane = LL#0

完成上述之后,按照协议规定,host TX和device RX 还要额外再发两个TRG_UPR1。

需要注意的是,这个示意图是在Unipro的SPEC中截取,两个方向的lane num不相同。而在UFS产品中,两个方向的lane num是必须相同的。

3. Phase 3 and 4(Data Lane Realignment)

这个过程就比较简单了,每个TX发送 TRG_UPR2, 在RX收到之后, 再发送两个额外的TRG_UPR2就好了。

另外,也要把TX的logical lane numer配置好。

4. Capability Exchange

Phase4完成之后就要PA layer通过logical lane0 发送capability 以及一些version信息给对方。按照顺序包括PACP_CAP_EXT2_ind, PACP_CAP_EXT1_ind 以及PACP_CAP_ind。

从PA上看到发PACP_CAP_EXT1_ind以及PACP_CAP_ind的过程:

PACPZ_CAP_EXT1的内容:

至此,link start up的过程就完成了, host 和UFS之前沟通的桥梁就搭建起来了。 

后面的故事,就从NOP OUT拉开序幕了。

<think>嗯,用户想了解UFS的启动加载过程。首先,我需要回忆一下UFS的基本结构和工作原理。UFS(Universal Flash Storage)是一种用于移动设备的存储标准,支持高速数据传输。它的启动过程涉及多个步骤,包括初始化、逻辑单元配置、安全启动等。 根据用户提供的引用内容,特别是引用[1]到[4],我需要整合这些信息。首先,UFS初始化阶段,ATF(Arm Trust Firmware)负责安全启动,这可能涉及硬件级别的初始化和安全检查。然后是Link up过程,这里可能需要建立主机与UFS设备之间的物理连接。接下来是nop out操作,可能是指发送NOP命令来确认设备响应。 在设置fDeviceInit标志时,可能需要通过Query Request来配置设备参数。引用[2]提到bBootLunEn属性的设置,这决定了哪个逻辑单元(LU)在启动时处于活动状态。如果设置为00h,启动特性未启用,这可能影响后续的启动流程。测试设备就绪状态(Test Unit Ready)和读取容量(Read Capacity)也是关键步骤,确保设备准备好并提供存储信息。 然后,启动流程决策部分,设备管理器通过查询bBootLunEn属性来确定活跃的启动LU,如LU1或LU4。这可能涉及到选择不同的启动分区,类似于双系统启动的概念。RPMB部分提到的重放保护内存块可能与安全启动相关,确保启动代码的完整性和真实性。 用户可能对具体的步骤和配置参数感兴趣,比如如何设置bBootLunEn,或者启动过程中各命令的执行顺序。此外,安全启动机制和错误处理也是需要详细说明的部分。需要确保解释清楚每个步骤的作用,以及不同配置对启动流程的影响。 可能还需要区分正常启动模式和Boot Mode的区别。引用[4]提到Boot Mode结束后是否发送CMD0的问题,这说明在Boot Mode下,设备可能直接进入传输状态,无需某些命令。这涉及到UFS协议的状态转换,需要明确各阶段的状态变化和命令使用。 用户可能在进行UFS相关开发或故障排查,因此需要详细的技术细节和流程说明。同时,生成的相关问题需要涵盖性能优化、安全机制、协议差异和调试方法,帮助用户进一步深入学习。</think>### UFS Boot加载过程详解 #### 1. **硬件初始化与安全启动** UFS设备上电后,首先执行硬件初始化流程,包括时钟配置、电源管理以及物理层(UniPro和M-PHY)的链路建立(Link up)[^1]。此时通过Arm Trust Firmware(ATF)完成安全启动验证,确保固件的合法性[^1]。 #### 2. **逻辑单元(LU)配置** 关键步骤是通过`bBootLunEn`属性指定启动逻辑单元: - **`bBootLunEn`属性设置**:主机发送`Query Request`命令,设置`bBootLunEn`为`01h`(选择Boot LU A)或`02h`(选择Boot LU B)。若设置为`00h`,则禁用启动特性[^2]。 - **LU映射**:Boot LU A对应逻辑单元1(LU1),Boot LU B对应逻辑单元4(LU4),分别存储不同版本的启动代码[^3]。 #### 3. **启动流程核心步骤 1. **设备状态检测** 主机发送`Test Unit Ready`命令确认设备就绪状态,若返回错误需重试链路初始化[^1]。 2. **容量读取** 通过`Read Capacity 10`命令获取Boot LU的存储容量信息,验证分区有效性[^1]。 3. **代码加载** 主机从指定Boot LU读取启动代码,采用DMA传输至内存。代码加载完成后,UFS设备退出Boot模式并进入Tran状态,无需额外发送`CMD0`[^4]。 4. **RPMB安全验证** 若启动代码包含敏感数据(如密钥),通过Replay Protected Memory Block(RPMB)进行完整性校验[^3]。 #### 4. **错误处理机制 - **超时重试**:链路建立失败时触发NOP Out重试机制[^1]。 - **属性校验**:非法`bBootLunEn`值(如保留值`03h`)将导致设备拒绝请求[^2]。 #### 5. **状态转换示意图 ``` Boot Mode → Link Up → LU配置 → 代码加载 → Tran State ``` #### 流程图表示 ```plaintext +----------------+ +---------------+ +-----------------+ | 设备上电初始化 | → | 安全启动验证 | → | 设置bBootLunEn | +----------------+ +---------------+ +-----------------+ ↓ +--------------+ | 启动代码加载 | → RPMB校验 +--------------+ ↓ +-----------------+ | 进入Tran状态 | +-----------------+ ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值