ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DS5Dongle 支持 DualSense Edge:DSE Profile 解锁握手协议深度解析(附时序与状态机)

DS5Dongle 支持 DualSense Edge:DSE Profile 解锁握手协议深度解析(附时序与状态机) DS5Dongle 支持 DualSense EdgeDSE Profile 解锁握手协议深度解析附时序与状态机【免费下载链接】DS5DongleTurn your Pico 2 W into a DualSense 5 dongle.项目地址: https://gitcode.com/gh_mirrors/ds/DS5DongleDS5Dongle 是一款把 Raspberry Pi Pico 2 W 变成 DualSense 5 无线手柄适配器的开源固件项目它不仅能让 DS5 手柄无线连接电脑如今还新增了DualSense EdgeDSE手柄支持通过复刻 Play Station 配件应用的解锁握手协议让手柄里保存的 4 个自定义 Profile 在首次打开 PS Accessories 应用时就能被正确读取。本文将带你读懂这套 DSE Profile 握手协议的完整时序与状态机设计。⚡ 为什么 Edge 手柄的 Profile 这么难读普通 DualSense 手柄接入 USB 后主机随时可以读取它的各种状态报告。但 DualSense Edge 的自定义 Profile手柄内置的 4 个按键/摇杆配置档位并不直接开放PS Accessories 应用通过0x70–0x7B共 12 个 feature 报告读取 Profile 快照但手柄只在收到一条特殊的 SET 0x80 解锁命令并处理完毕后才会把这些报告填充好这条解锁命令的处理耗时约3.5 秒且命令必须携带合法的CRC32 校验尾否则会被手柄以HANDSHAKE 0x04参数无效拒绝。这就形成了一个两难等 3.5 秒再连 USB 会拖慢设备识别不等又会让应用读到空快照Profile 显示未分配。DS5Dongle 的 DSE 模块src/dse.h 中有完整协议注释的解法是——先连 USB边等边预取用NAK 重试骗过应用的缓存逻辑。 第一步如何识别 DualSense Edge手柄蓝牙配对成功后固件会读取0x20 固件信息报告src/bt.cpp若报告第 23 字节为0x44则判定为 DSE 手柄日志打印Connected DSE Controller随即触发dse_on_connect()启动解锁流程。识别结果还影响 USB 端点描述符src/usb_descriptors.cpp 中会根据is_dse把设备串名上报为 DualSense Edge Wireless Controller让主机系统正确显示手柄型号。⏱ 解锁握手时序从连接就绪到快照可读下面是 DSE 模块复刻的完整握手时序源码见 src/dse.cppPico 2 WDS5Dongle DualSense Edge 手柄 |---------------------------------| ① SET 0x65原样回显 0x20 报告体63 字节 |----------------------------------| ② 收到 SET 0x80 {0x70,0x01}带 CRC32 | 同时 USB 立即枚举游戏可玩| ③ 手柄后台处理解锁约 3.5 秒 |---------------------------------| ④ 4 秒后开始节奏预取GET 0x70 |----------------------------------| ⑤ 每 80ms 一个 GET直到 0x7B | ⑥ profiles_ready 置位应用读取成功三个关键动作SET 0x65 回显把手柄刚上报的 0x20 固件报告体原样回显回去原生主机也是这么做的完成握手确认SET 0x80 解锁报文{0x70, 0x01, ...}由set_feature_data()自动追加 CRC32 校验后发出src/bt.cpp缺失校验会被手柄拒收USB 立即连接不阻塞设备枚举游戏可以马上玩Profile 读取被门控住。 状态机profiles_ready 门控与 NAK 重试DSE 模块内部只有几个非常简洁的状态变量src/dse.cpp状态变量取值含义unlock_phase0空闲解锁流程未启动unlock_phase1已发出 SET 0x80等待手柄准备快照profiles_readyfalse快照未就绪USB 读 0x70–0x7B 一律返回 0NAKprofiles_readytrue快照就绪应用读取返回真实数据门控逻辑在 USB 的 GET_REPORT 回调里src/main.cpp应用读取 Profile 报告时若dse_profiles_ready()为 false固件故意返回 0NAK同时仍在后台发起蓝牙 GET。PS Accessories 应用在加载时本来就反复轮询这些报告所以它只会安静地重试——直到 4 秒后预取完成、门控放开应用拿到的就是完整快照而不会把空数据缓存下来。这是整套协议最巧妙的地方利用应用自身的重试机制把等待的代价转移给了应用侧用户无感知。 保存 Profile 后的快照再生周期手柄的 Profile 快照有个坑你在应用里保存一个新 Profile写入了存储区SET 0x60–0x62但读回用的快照并不会自动更新——原生情况下要等下次打开应用才生效。DSE 模块在检测到 Profile 写入后会复刻 PS 应用自己的刷新周期src/dse.cppt0 转发 SET 0x60~0x62保存 Profile t≈500ms 重新发送 SET 0x80 解锁命令 t≈1s~2.5s 轮询 GET 0x81 状态报告 ×6 次间隔 250ms t≈5.5s 以 80ms 节奏重新预取 0x70–0x7B 快照于是保存立即生效无需重启手柄或重新打开应用。⚠️ 为什么是 80ms 一拍——节奏预取的设计考量源码注释src/dse.cpp记录了一个实测现象一次性突发发出全部 12 个 Profile GET 请求会撑爆 L2CAP 控制通道的流控窗口导致部分请求被静默丢弃——表现为某个 Profile 在应用里显示not assigned。改为每 80ms 发一个 GET读取才稳定可靠。12 个报告 × 80ms ≈ 1 秒加上解锁等待的 4 秒用户从插上手柄到 Profile 可读大约需要 5 秒且游戏连接完全不受影响。 核心模块速查模块职责src/dse.hDSE 协议总览与对外接口定义src/dse.cpp解锁握手、节奏预取、保存后再生周期src/bt.cpp蓝牙控制通道分发、Edge 识别0x44src/main.cppUSB GET_REPORT 回调与 NAK 门控src/usb_descriptors.cppEdge 串名上报tools/wireshark_dualsense_setstate.lua抓包辅助脚本可辅助分析 SET 报文 总结DS5Dongle 的 DSE 支持展示了嵌入式固件里一个漂亮的工程范式逆向出主机协议 → 逐字节复刻握手 → 用应用重试机制掩盖异步延迟。整套状态机仅用寥寥百行代码src/dse.cpp 全文约 160 行就让 PS Accessories 应用以为自己直连着原生蓝牙主机。如果你也想在自己的 Edge 手柄上体验这套能力获取固件的方式见 README.md 中的Getting Started章节下载预编译.uf2拖入 BOOTSEL 模式即可无需任何额外工具。【免费下载链接】DS5DongleTurn your Pico 2 W into a DualSense 5 dongle.项目地址: https://gitcode.com/gh_mirrors/ds/DS5Dongle创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表