黑猫详解【UFS Unipro】第2篇:Power States & Power Modes详解

本文详细解析了UFS Unipro协议中的Power States和Power Modes,包括Fast_Mode、Slow_Mode、FastAuto_Mode、SlowAuto_Mode、Hibernate_Mode和Off_Mode。介绍了每个模式的特点、功耗以及状态转换,强调了在功率模式改变过程中DME的请求、L2计时器更新和请求完成的步骤。

本文依据Unipro1.8/M-PHY4.1/UFSHCI3.0协议及个人工作经验整理而成,如有错误请留言。
文章为个人辛苦整理,付费内容,已加入原创维权,禁止私自转载。
文章所在专栏:《黑猫带你学:UFS协议栈详解》——UFS Unipro/M-PHY/HCI协议栈
兄弟专栏:《黑猫带你学:UFS协议详解》——UFS JEDEC协议

1 Power Mode概述

了解power mode之前先要知道:一个是功率模式,一个是功率状态,不要搞混了!

UniPro定义了六种功率模式,它们是从底层PHY提供的功率模式中抽象出来的功率模式。UniPro在所有模式下,每个方向最多支持4个PHY信道。
未使用的信道保持HIBERNATE_STATE状态。未连接的信道保持OFF_STATE状态。

Fast_Mode:
能够实现所有功率模式中最高的数据传输速率。链接总是随时准备发送和接收数据,同时提供一个定义良好的延迟,这是任何UniPro功率模式中最低的。Fast_Mode中每个数据通道的实际数据速率是PHY指定的。
power state:FAST_STATE

UFS协议中,固件升级操作(Field Firmware Update,FFU)是一种允许主机更新UFS设备内部固件的机制。FFU操作相对简单,但需要遵循特定流程以确保固件更新的完整性和可靠性。以下是关于UFS协议中FFU操作的详细内容概述。 在执行FFU之前,主机需要确认设备是否支持FFU功能。这通常通过读取设备的EXT_CSD寄存器中的相关字段来完成。一旦确认设备支持FFU,就可以开始准备固件更新过程。 FFU操作主要依赖于`WRITE BUFFER`命令,其中模式(MODE)应设置为0Eh。主机通过该命令将固件二进制文件(FW bin)下载到UFS设备中。下载过程可以是一次性完成,也可以将固件拆分成多个部分分别发送。在分多次发送的情况下,建议所有数据都发送到同一个逻辑单元号(LUN),并且`WRITE BUFFER`命令的属性应设置为simple或ordered。此外,缓冲区偏移量(BUFFER OFFSET)应从0开始,并以4KB对齐的方式递增[^1]。 在固件下载完成后,新的固件并不会立即生效。为了使更新后的固件生效,必须对设备执行电源循环(power cycle)或硬件复位(HW reset)。这是FFU流程中的关键步骤,因为只有在这两种操作之后,设备才会加载并运行新版本的固件[^1]。 在执行电源循环或硬件复位后,主机应读取设备的`bDeviceFFUStatus`字段,以确认FFU是否成功完成。如果状态指示更新失败,可能需要重新尝试整个过程或采取其他恢复措施。 值得注意的是,在FFU过程中,设备不会响应其他模式的`WRITE BUFFER`命令。这意味着在固件更新期间,设备处于一种特殊状态,仅接受与FFU相关的命令和数据传输[^1]。 对于eMMC设备而言,FFU流程略有不同。进入FFU模式后,主机可以通过一次或多次命令向设备发送固件文件包。如果需要终止FFU流程或恢复设备的正常功能,可以通过设置EXT_CSD寄存器中的`MODE_CONFIG`字段来退出FFU模式。然而,一旦退出FFU模式,正在进行的固件传输将被终止[^2]。 总的来说,UFS协议中的FFU操作提供了一种简便而有效的方式来更新设备固件,确保设备能够持续获得功能改进和错误修复。通过遵循正确的操作流程,可以最大限度地减少更新失败的风险,并确保设备在更新后的稳定运行。 ### 示例代码:模拟FFU流程 以下是一个简化的Python示例,用于模拟UFS设备的FFU流程。请注意,这只是一个概念性示例,并不涉及实际的硬件操作。 ```python class UFSDevice: def __init__(self): self.firmware_buffer = bytearray() self.ffu_active = False self.device_ffu_status = "SUCCESS" def write_buffer(self, mode, buffer_offset, data): if mode != 0x0E: raise ValueError("Invalid mode for FFU operation") if buffer_offset != len(self.firmware_buffer): raise ValueError("Buffer offset must be aligned and sequential") self.firmware_buffer.extend(data) print(f"Wrote {len(data)} bytes to buffer offset {buffer_offset}") def power_cycle(self): print("Performing power cycle...") # Simulate loading new firmware if len(self.firmware_buffer) > 0: print("New firmware activated.") self.device_ffu_status = "SUCCESS" else: print("No firmware data found.") self.device_ffu_status = "FAILURE" self.ffu_active = False def get_ffu_status(self): return self.device_ffu_status # Example usage ufs_device = UFSDevice() # Simulate writing firmware in chunks chunk1 = b'\x00' * 4096 # First chunk chunk2 = b'\xFF' * 4096 # Second chunk ufs_device.write_buffer(mode=0x0E, buffer_offset=0, data=chunk1) ufs_device.write_buffer(mode=0x0E, buffer_offset=4096, data=chunk2) # Perform power cycle to activate new firmware ufs_device.power_cycle() # Check FFU status print(f"FFU Status: {ufs_device.get_ffu_status()}") ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑猫学长呀

有帮助到你就来打个赏呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值