黑猫带你学UFS协议第2篇:UFS相关名词释义

本文是《黑猫带你学:UFS协议详解》系列的第二篇,主要解释了UFS协议中的相关名词,如CDB、CPort、DME等,旨在帮助读者理解和查询UFS协议中的关键术语。

文/黑猫学长

1 前言

1.1 声明

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

1.2 本文背景

本文关键词包括但不限于UFS jedec3.1协议第3章节:《Terms and definitions》内容。更多关于UFS协议层的关键词,直接查阅spec相关章节即可,清晰明了,此处没必要再一一列出。

本文为本人工作学习中常听到或常用到关乎于ufs/flash的一些关键词合集,没有固定分类,不需要强行记忆,供查询使用。

2 名词释义

CDB
Command Descriptor Blocks,CDB中包含命令操作码、参数、标志flags、属性。

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、付费专栏及课程。

余额充值