Host Controller 初始化
当UFS Host Controller上电复位时,所有 MMIO 寄存器都将处于其上电默认状态,并且UFS Host controller 和UFS 芯片的链路(就是TX,RX)将处于非活动状态(inactive)。 以下是UFS Host controller 软件为了初始化UFS Host Controller而要执行的操作:
- 启动UFS Host Controller的第一步是正确编程系统总线接口。 这一步与UFS Host Controller实现所使用的系统总线有关,因此应遵循特定系统总线的文档。该步完成时,UFS Host Controller应准备好在系统总线上传输数据。
- 为了启用host controller ,将 1 写入 HCE(host controller enable) 寄存器。 这触发了本地 UIC 层的自主基本初始化(autonomous basic initialization)。 初始化序列应由 DME_RESET 和 DME_ENABLE 命令组成。 可以根据实现需要添加其他命令,如 DME_SET 命令。 在基本初始化序列期间,HCE 的值一直为 0。
- 需要一直等待,直到 HCE 读为 1 。这个时候表示基本的初始化序列已经完成。
- 附加命令(如 DME_SET 命令)可以从系统主机发送到 UFS host controller ,以提供配置灵活性。
- 可选地将 IE.UCCE(UIC command completion enable)设置为 1,以便使能 IS.UCCS(UIC Command Completion Status)中断。
- 发送 DME_LINKSTARTUP 命令以开始链路启动流程 (link startup procedure)
- 在完成 了DME_LINKSTARTUP 命令,如果设置了 IE.UCCE,那么将置位IS.UCCS ,这个时候可以向系统主机标记中断, 该中断将独立于 GenericErrorCode 进行标记。
- 如果完成的 DME_LINKSTARTUP 命令的 GenericErrorCode 为 SUCCESS,那么除了 IS.UCCS 位之外,还将设置 HCS.DP(device present)。
- 检查 HCS.DP 的值,并确保连接有一个设备。 如果检测到设备的存在,转到步骤 10;否则,在 IS.ULSS 设置为 1 后重新发送 DME_LINKSTARTUP 命令(转到步骤 6)。 IS.ULSS 等于 1 表示 UFS 设备已准备好进行链接启动。
- 通过写IE 寄存器来启用附加中断。
- 使用阈值(IACTH)和超时(IATOVAL)的值来初始化中断聚合控制寄存器(UTRIACR)。注意当运行/停止寄存器(UTRLRSR)未被使能或没有请求未完成时,也可以随时执行UTRIACR初始化。
- 如果需要,通过 UIC 命令接口 (interface) 完成host controller配置。
- 分配和初始化 UTP 任务管理请求列表。(Allocate and initalize UTP Task Management Request List)
- 分配 UTP Task Management Request List 的起始地址,并且用一个 64 位地址指针指向它。
- 分配和初始化 UTP 传输请求列表(UTP Transfer Request List)
- 分配 UTP Transfer Request List 的起始地址,并且用一个 64 位地址指针指向它。
- 通过将 UTP 任务管理请求列表 Run-Stop Register(UTMRLRSR)设置为 1,以此来启用 UTP Task Mangement Request List。 该操作允许 host controller 通过 UTP Task Management Request Door Bell 机制开始接受 UTP 任务管理请求。
- 通过将 UTP 传输请求列表 Run-Stop Register(UTRLRSR)设置为 ‘1’ ,以此来启用 UTP Transfer Request List。该操作允许主机控制器通过 UTP Transfer Request Door Bell 机制开始接受 UTP 传输请求。
- bMaxNumOfRTT 将被设置为 bDeviceRTTCap 和 NORTT 的最小值。
上面是Jedec规定的UFS Host Controller的初始化流程,如下是笔者使用的UFS测试机器的初始化流程:
- 通过HCE(Host controller enable)来去使能UFS Host Controller。
- 通过HCE(Host controller enable)来使能UFS Host Controller。
- 执行DME reset(Cold reset) command
- 执行DME enable command。
- 执行DME_LINKSTARTUP command。
- 检查device preset(HCS.DP),以此来校验link startup是不是成功的。
- 通过Interrupt Enable(IE)来使能中断。
- 分配和初始化UMTRL。
- 分配和初始化UTRL。
- 通过UTMRLRSR来使能UTP task management request list。
- 通过UTRLRSR来使能UTP transfer request list。
- 发送是一个DME_GET(PA_TX_GEAR)以此来校验link是可以操作的