UFS系列六:UFS设备初始化和启动

转载:蛋蛋读UFS之六:UFS设备初始化和启动

这一节讲讲UFS初始化。

初始化和启动包括三个阶段:部分初始化,加载启动代码(可选)和初始化完成。

部分初始化阶段

这个阶段开始于上电或者设备重启,它涉及到整个UFS栈的初始化。

这个初始化阶段完成后,整个物理层(M-PHY)和数据链路层(UniPro)应该被初始化好,传输层可以和主机交互Read命令和“TEST UNIT READY”命令(主机发该命令给设备,查询设备是否准备好),主机也可以通过设备管理器访问设备描述符(Device Deor),获取设备配置信息。

加载启动代码

如果启动代码不是存储在UFS设备上,则没有这一阶段。主机怎么知道启动代码是不是存储在UFS设备上呢?

经过前一阶段的初始化,主机可以访问设备描述符,获得“bBootLunEn ”属性,读取该属性可以知道启动代码是否在UFS设备上,以及具体在哪个Boot LU 上面。

如果bBootLunEn = 01h或者02h,说明启动代码存储在UFS设备上。由于Boot LU是映射到普通的LU上的,要读取启动代码,还需要知道Boot LU和存储启动代码LU的映射。主机可以通过读取单元描述符(Unit Deor)知道,比如:

查找到具体存储代码的LU,主机就可以读取该LU获得启动代码。

初始化完成

当主机完成前面两个阶段,主机会通过设备管理器,给设备设置fDeviceInit = 1,这是一个标志(flag),用以初始化。 主机设置了该标志后,然后就一直在那查询该标志的值。

与此同时,UFS设备的固件继续完成自己的初始化,当设备完成初始化,认为可以响应主机任何命令或者请求时,就清掉fDeviceInit,即fDeviceInit = 0。

当主机查询到fDeviceInit =0,就可以发任何UFS协议中的任何命令或请求给UFS设备。

至此,整个UFS初始化和启动完成。

下图具体展示了UFS初始化和启动过程(可选的,Opt):

再解释一下这个启动过程:

主机给设备上电或者重启设备,然后主机和设备端的物理层和数据链路层完成初始化,之后主机ping设备(通过NOP OUT UPIU),确认设备双方连接正常。设备收到NOP OUT UPIU,应该回NOP IN UPIU,表明双方连接没有问题。

加载启动代码可选(上图蓝色方框中的步骤)。主机读取UFS设备描述符,如果bDescrAccessEn = 0,设备描述符不可访问,那么,即使启动代码存储在UFS设备上,我们也无法在该阶段加载启动代码,因为诸如bBootEnable和bBootLunEn之类的信息无法获取,主机就无法知道存储代码存储在哪个LU上。因此,如果bDescrAccessEn = 0,加载启动代码阶段不应该放在这里,而是在设备彻底初始化好后。

加载启动代码阶段,主机通过读取设备描述符,获得启动代码在哪个LU上,然后发个试探性命令“TEST UNIT READY”给该LU,查看该LU是否准备好。如果Boot LU准备好,主机就通过发READ命令给设备,加载启动代码。

然后,主机设置fDeviceInit = 1,然后一直轮询该标志,一旦fDeviceInit 变成0,标志UFS设备初始化完成。

最后,再把设备初始化过程中,双方交互的内容做个总结:

  • 8
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值