UFS的初始化过程(一)

对于不同的设备,eMMC和UFS来说,初始化的过程都很重要。从客户端来看,很多不良都发生在初始化阶段。

UFS的初始化比较麻烦,先再来看下UFS的结构。

UFS不同的layer有不同的SPEC,那么初始化的过程在不同的层面有不同的process. 这里先介绍UFS层的init process。

(一)UFS init过程

在UFS JEDEC中,对于UFS init过程的描述还是比较清楚的,如下图。这里的UFS host和UFS device指的是

1. 上电行为:Power-on Reset/HW Reset/EndPointReset

2. M-PHY layer initiation。这个动作是由host 和device端的M-PHY 各自独立完成的,中间没有信息交互。后面再展开。

3. Unipro 的boot sequence. 这个后面再展开。

4. UFS层面第一个握手动作。NOP OUT UPIU-> NOP IN UPIU.

5. 读取device descriptor, 这个过程是optional的。

6. SCSI read读取boot data from BOOT LU. 这个过程也是optional的,只有当BOOT LU ENABLE,及host选择从UFS boot时,才会有这个过程。 BOOT LU的大小一般都是几十MB左右,里面存放是bootloader的数据,大部分的系统数据,如kernel等还是存放在user分区的LU中。

7. Query request(SET FLAG fDeviceInit)这是host 最后和device确认init的过程已经完成了。

在实际的手机启动过程中,开机过程并不是一次init过程完成的,可能需要2,3甚至5次init的过程。

<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状态 | +-----------------+ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值