0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

讲讲UFS初始化和启动

SSDFans 来源:未知 作者:李倩 2018-06-15 14:50 次阅读

这一节讲讲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设备初始化完成。

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据链路层
    +关注

    关注

    0

    文章

    51

    浏览量

    11943
  • UFS
    UFS
    +关注

    关注

    6

    文章

    101

    浏览量

    23546

原文标题:蛋蛋读UFS之六:UFS设备初始化和启动

文章出处:【微信号:SSDFans,微信公众号:SSDFans】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RT-Thread自动初始化详解

    是指初始化函数不需要被显式调用,只需要在函数定义处通过宏定义的方式进行申明,就会在系统启动过程中被执行,非常的方便。 1 普通初始化 前面也讲了,我们在写单片机的程序时,需要对硬件进行初始化
    的头像 发表于 06-25 21:38 9558次阅读
    RT-Thread自动<b class='flag-5'>初始化</b>详解

    求助:80c51f040系列单片机初始化问题

    为什么单片机要初始化,因为要把这个单片机初始化,程序都写不了,都要初始化什么啊,谁能跟我讲讲
    发表于 05-09 14:20

    51的启动,keil编译时候 单片机一开始 怎么初始化ROM,

    有没有大神,能简单说说,比如keil编译时候 单片机一开始 怎么初始化ROM,就是对变量,初值,堆栈,之类 怎么分配的对于stm32我知道进user app之前有一段bootload,请问51是怎么处理,很少有书提到,就是提到也是一笔带过,有牛人出来随便讲讲
    发表于 03-20 18:00

    AD9364初始化问题及标准初始化流程?

    AD9364初始化好像不成功。能否请官方给出一个使用外部晶体(如33MHz),FDD的标准初始化例子。
    发表于 09-28 14:56

    蓝牙广播初始化详解

    第一讲 讲述了蓝牙样例的建立,第二讲 描述了协议栈初始化,本讲讲探讨下广播初始化问题:具体教程如下,兼容52系列:宝贝链接点击具体教程如下,兼容52系列:宝贝链接点击青风手把手教你学蓝牙34:蓝牙
    发表于 07-20 04:26

    端口初始化初始化中断

    目录PA9(TX),PA10(RX)1、端口初始化2、初始化外设3、初始化中断4、使能中断5、使能外设5、发送数据PA9(TX),PA10(RX)1、端口初始化1.开启PA时钟2.PA
    发表于 08-16 06:54

    初始化封装

    初始化封装您可以在 Mask Editor 的 Initialization 窗格中添加 MATLAB® 代码以初始化封装模块。Simulink® 将执行这些初始化命令以便在关键时刻(如模型加载
    发表于 08-27 07:17

    怎样通过按键启动初始化函数使ESP8266正常启动

    如何利用stm32+AT指令去设置esp8266呢?怎样通过按键启动初始化函数使ESP8266正常启动呢?
    发表于 12-09 07:30

    RT-Thread系统自动初始化机制简介

    RT-Thread 自动初始化机制1、自动初始化机制简介在系统启动流程图中,有两个函数:rt_components_board_init() 与 rt_components_init(),其后的带
    发表于 04-12 17:43

    RT-Thread系统初始化启动流程详细描述

    voidrt_system_scheduler_start (void)启动系统调度器voidrt_system_timer_init (void)初始化系统系统定时器voidrt_system_timer_thread_init (void)
    发表于 08-25 15:15

    BPI启动,Flash初始化失败

    我有一个KC705评估板配置为在x16模式下使用BPI Flash。在使用JTAG端口加载设计位文件的后,我可以初始化闪存。但是,当我从BPI启动我的设计时,闪存初始化失败,但程序的其余部分似乎正常运行。请问一下有遇到过这种问题
    发表于 10-11 13:11

    如何多次初始化blufi?

    的回调函数)2. 配对完成后能完全关闭蓝牙我想要知道:1. 是不是下列代码中有部分初始化函数是启动后只能进行一次的(查阅文档确实发现一部分函数仅可运行一次2. 启动后仅可进行一次的操作是否会消耗较多资源
    发表于 02-21 06:55

    S32R41 flexcan无法在QSPI启动模式下初始化OK,但在串行启动模式下可以初始化OK是为什么?

    flexcan在QSPI启动模式下无法初始化OK ,但在串行启动模式下可以初始化OK; 在qspi启动模式和串行
    发表于 06-06 07:18

    RDA1846S初始化设置

    RDA1846S初始化设置RDA1846S初始化设置RDA1846S初始化设置
    发表于 01-15 17:08 0次下载

    单片机问题总结:MPU6050的DMP模块初始化放在线程启动之前

    单片机问题总结:MPU6050的DMP模块初始化放在RTOS线程启动之前文章目录单片机问题总结:MPU6050的DMP模块初始化放在RTOS线程启动之前问题复现问题总结问题解决问题复现
    发表于 12-06 14:06 10次下载
    单片机问题总结:MPU6050的DMP模块<b class='flag-5'>初始化</b>放在线程<b class='flag-5'>启动</b>之前