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

原创内容,转载请注明:  [http://www.ssdfans.com]  谢谢!

这一节讲讲UFS初始化。

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

  • 部分初始化阶段

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

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

  • 加载启动代码

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

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

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

查找到具体存储代码的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设备初始化完成。

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

分类目录 存储, 技术文章, 闪存.
扫一扫二维码或者微信搜索公众号ssdfans关注(添加朋友->点最下面的公众号->搜索ssdfans),可以经常看到SSD技术和产业的文章(SSD Fans只推送干货)。
ssdfans微信群介绍
技术讨论群 覆盖2000多位中国和世界华人圈SSD以及存储技术精英
固件、软件、测试群 固件、软件和测试技术讨论
异构计算群 讨论人工智能和GPU、FPGA、CPU异构计算
ASIC-FPGA群 芯片和FPGA硬件技术讨论群
闪存器件群 NAND、3D XPoint等固态存储介质技术讨论
企业级 企业级SSD、企业级存储
销售群 全国SSD供应商都在这里,砍砍价,会比某东便宜20%
工作求职群 存储行业换工作,发招聘,要关注各大公司招聘信息,赶快来
高管群 各大SSD相关存储公司高管和创始人、投资人

想加入这些群,请微信扫描下面二维码,或搜索nanoarchplus,加阿呆为微信好友,介绍你的昵称-单位-职务,注明群名,拉你进群。SSD业界需要什么帮助,也可以找阿呆聊。