黑猫详解【UFS Unipro】第3篇:DME reset详解

本文详细介绍了UFS协议中三种重要的reset类型:Cold Reset、Warm Reset和EndPointReset,包括它们的触发条件、复位过程以及对Unipro Stack的影响。Cold Reset和Warm Reset会重置所有层至初始状态,而EndPointReset则是本地应用请求对端设备复位的机制,但对端设备可以选择执行或拒绝。

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

1 概述

三种reset:
UniPro Cold Reset、 UniPro Warm Reset、EndPointReset.
这三种reset对于Unipro来说是强制的。

Cold Reset和Warm Reset会对host和device的整个UniPro stack中的L1.5至L4层都有影响,包括相应的属性。
在这里插入图片描述
UniPro Cold Reset or UniPro Warm Reset进程结束时,UniPro Link是不使能的,要么进入Off State(DME_P

### UFS FFU 操作概述 UFS协议中的FFU(Field Firmware Update)是一种用于更新UFS设备固件的机制,其核心流程包括:确认设备支持FFU、通过`WRITE BUFFER`命令传输固件数据、执行电源循环或硬件复位以激活新固件,并最终验证更新状态。FFU操作期间,设备仅接受与固件更新相关的命令,其他模式的`WRITE BUFFER`命令将被忽略。 在FFU流程中,主机通过设置`WRITE BUFFER`命令的模式为0Eh,并将固件数据分块写入设备的缓冲区中。数据写入应保持缓冲区偏移量从0开始,并以4KB对齐的方式递增。固件数据传输完成后,必须对设备执行电源循环或硬件复位,以加载并运行新固件。更新完成后,主机应读取`bDeviceFFUStatus`字段以确认更新结果[^1]。 ### Android MTK平台UFS FFU脚本设计思路 在Android MTK平台上,UFS设备的FFU操作通常通过设备节点(如`/dev/block/sda`)与内核驱动交互完成。由于UFS FFU操作涉及底层硬件控制,需使用具有足够权限的脚本语言(如shell脚本)并结合系统工具(如`ioctl`调用、`dd`、`cat`等)进行操作。 以下是一个基于UFS FFU流程的`.sh`脚本示例,模拟固件升级的基本步骤。该脚本假设固件文件已准备好,并且设备支持FFU操作。实际部署时,应结合平台SDK、驱动接口及UFS控制器的具体实现进行适配。 ### 示例:UFS FFU 升级 Shell 脚本 ```bash #!/bin/sh # 配置参数 DEVICE="/dev/block/sda" FIRMWARE_FILE="/data/firmware.bin" BUFFER_OFFSET=0 BUFFER_SIZE=4096 MODE=0x0E # 检查固件文件是否存在 if [ ! -f "$FIRMWARE_FILE" ]; then echo "Firmware file not found: $FIRMWARE_FILE" exit 1 fi # 确认设备是否支持FFU(伪代码,需替换为实际ioctl调用) # 这里假设通过读取设备特性寄存器判断支持性 # SUPPORT_FFU=$(ioctl $DEVICE GET_FFU_SUPPORT) SUPPORT_FFU=1 if [ "$SUPPORT_FFU" -ne 1 ]; then echo "Device does not support FFU" exit 1 fi # 分块写入固件 echo "Starting firmware update via FFU..." exec 3<> "$DEVICE" || { echo "Failed to open device $DEVICE" exit 1 } # 使用dd分块写入 while true; do dd if="$FIRMWARE_FILE" of="$DEVICE" bs=$BUFFER_SIZE skip=$BUFFER_OFFSET count=1 seek=$BUFFER_OFFSET if [ $? -ne 0 ]; then echo "Failed to write buffer at offset $BUFFER_OFFSET" exec 3<&- exit 1 fi BUFFER_OFFSET=$((BUFFER_OFFSET + 1)) done exec 3<&- echo "Firmware data written successfully" # 执行电源循环(伪代码,需平台支持) echo "Performing power cycle or hardware reset..." # power_cycle_ufs_device # 验证更新状态(伪代码) # STATUS=$(ioctl $DEVICE GET_FFU_STATUS) STATUS="SUCCESS" if [ "$STATUS" == "SUCCESS" ]; then echo "FFU update completed successfully" else echo "FFU update failed" exit 1 fi ``` ### 注意事项与平台适配 - **权限问题**:FFU操作涉及底层设备控制,脚本需以root权限运行。 - **ioctl接口**:实际操作中需调用内核提供的`ioctl`接口与UFS控制器通信,如获取设备支持状态、触发电源循环等。 - **分块写入**:建议以4KB为单位进行写入,确保缓冲区对齐。 - **错误处理**:脚本中应加入完善的错误检测机制,如校验写入数据完整性、处理写入失败等。 - **平台SDK依赖**:MTK平台可能提供专用工具或API用于UFS设备管理,需查阅平台文档进行适配。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黑猫学长呀

有帮助到你就来打个赏呗

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

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

打赏作者

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

抵扣说明:

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

余额充值