把UFS启动起来总共分几步?回答:七步!
第一步:上电
需要给UFS供三路电VCC、VCCQ和VCCQ2,这三路电的供电是需要满足特定的时序要求。
第二步:M-PHY层初始化
M-PHY层初始化是在正确上电之后自动做的,UFS的两端(Host端和Device端)会同时做M-PHY层的初始化。初始化完成后,M-PHY进入到Hibern8状态。
第三步:UniPro层初始化
UniPro层的初始化也是在Host和Device两端同时进行的,但需要Host Controller发送DME_LINKSTARTUP指令。
第四步:UTP层初始化
首先,Host会发NOP OUT UPIU来询问Device的UTP层是否已经初始化完成。当然,Device因为内部要做很多处理一般不会这么快就完成UTP的初始化。于是Host会一直等,直到Device把UTP初始化完成后,回NOP IN UPIU给Host表明UTP已经初始化完成,可以进行到下一步初始化。
第五步:Host读取设备描述符
Host需要从UFS Device Descriptor读取的一些关键信息(比如DeviceClass, Subclass, Boot Enable, Boot LUs size等)来为后面的操作打基础。但对于boot过程这步不是必须的。
第六步:加载启动代码
最关键的一步,这也是为什么在第四步Host不离不弃等 UFS Device一起完成初始化的原因。因为这一步UFS Device要给整个系统提供Bootloader开机代码。首先Host发TEST UNIT READY命令到Boot LU来询问是否Boot LU可以被访问。如果访问请求被允许,那么Host会继续发SCSI READ命令来请求读取bootloader代码,UFS Device收到命令后就会从boot LU中把bootloader搬运到系统的RAM中,直到把所有的bootloader代码搬移完毕,才会开始最后一步。
第七步:UFS设备继续完成初始化
bootloader搬移完成后,Host会置标志位fDeviceInit为1来通知UFS Device可以完成最后的初始化收尾工作,并开始轮询这个标志位。UFS完成所有的初始化工作之后,UFS会reset fDeviceInit为0,来回应host端UFS已经完成所有的初始化工作。至此,UFS已经准备好接受host端的任何读写命令。
下图具体展示了UFS初始化和启动过程(Opt,可选的):
最后,再把设备初始化过程中,双方交互的内容做个总结:
参考文档:
-
JESD220E -> 13.1 UFS Boot
-
JESD223D -> 7.1 Host Controller Configuration and Control