基于 STM32F405RG 的 UltraLink 固件工程,当前集成了:
CMSIS-DAP HIDFIDO HIDUSB HID KeyboardUSB HID MouseMSC- LCD 中文菜单与设备侧交互
- SPI Flash 凭证存储
- UART4 串口控制的键盘 / 鼠标输入
当前 USB 枚举为:
VID:PID = cafe:4009Product = UltraLink CMSIS-DAP FIDO MSC
当前复合 USB 接口:
CMSIS-DAP HID:调试通道FIDO HID:CTAP1/U2F 与 CTAP2MSC:保留的大容量存储接口HID Keyboard:串口驱动的键盘输入HID Mouse:串口驱动的鼠标输入
已经打通:
webauthn.io注册与认证CTAP1/U2F VERSION / REGISTER / AUTHENTICATECTAP2 makeCredential / getAssertionCTAP2 getNextAssertionCTAPHID CANCELCTAPHID LOCK- USB HID 键盘 / 鼠标枚举
- UART4 全局串口命令输入,不需要先进入 LCD 的输入设备页面
补充行为:
- 当
alwaysUv = true时,设备会按规范禁用CTAP1/U2F REGISTER / AUTHENTICATE - 此时
getInfo.versions不再返回U2F_V2 authenticatorGetInfo- 已按 canonical CBOR 输出嵌套
optionsmap - 已补
Windows/libfido2预检兼容字段与顺序问题
- 已按 canonical CBOR 输出嵌套
ClientPINgetRetriesgetKeyAgreementsetPINchangePINgetPINToken
Bio Enrollment Preview- 已补最小
0x40getInfo兼容响应 - 当前仅用于主机预检兼容,不提供真实生物录入能力
- 已补最小
authenticatorConfigtoggleAlwaysUvsetMinPINLengthforcePINChange
credProtecthmac-secretcredBloblargeBlobKeyauthenticatorLargeBlobs- 更完整的
credMgmt- metadata
- enumerate RPs
- enumerate credentials
- delete credential
- update user information
- 板上
删除密钥 / 清空密钥 HID Keyboard / Mouse- 键盘 8 字节 boot/report 协议报文
- 鼠标 4 字节相对移动报文
- UART4 中断接收环形缓冲
- 命令队列与自动按键释放
- 支持
key、hid、裸 HID usage、type、m、click、btn、release - 每条非空命令行返回
AKM OK ...状态行,便于上位机确认
当前仍在继续补全:
- Windows Hello 账户登录场景的进一步兼容
- Windows 预触摸探测链的剩余兼容细节
Core/:主循环、LCD、编码器、板级输入输出USB_DEVICE/App/:FIDO、U2F、凭证存储、密码学cmake/:CMake 与 ARM GCC toolchaintools/:字模生成等辅助脚本
Debian / Ubuntu / Deepin:
sudo apt update
sudo apt install -y cmake build-essential git pkg-config libusb-1.0-0-dev本工程使用 arm-none-eabi-gcc,要求可执行文件在 PATH 中。
如果你使用 xPack 版本,可以像下面这样加入环境变量:
export PATH="$HOME/.local/tools/xpack-arm-none-eabi-gcc-15.2.1-1.1/bin:$PATH"验证:
arm-none-eabi-gcc --version如果本机已经有 probe-rs,确保它在 PATH 中;例如:
export PATH="$HOME/.local/tools/probe-rs-tools-x86_64-unknown-linux-gnu/bin:$PATH"
probe-rs --version如果没有,可以按 probe-rs 官方方式安装,或者使用预编译包。
Linux 下建议安装 libfido2 相关工具,便于验证 PIN / getInfo / credMgmt:
sudo apt install -y libfido2-1 libfido2-dev如果发行版提供 fido2-token,可一并安装对应工具包。
首次配置:
cd /home/hao/link/A/F405_USB_HS_MSC
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug编译:
cmake --build build -j4产物:
build/F405_DEBUG.elf
probe-rs list当前开发中使用的 ST-LINK 例子:
probe-rs download build/F405_DEBUG.elf \
--chip STM32F405RGTx \
--probe 0483:3748:2B4907 \
--speed 950probe-rs reset \
--chip STM32F405RGTx \
--probe 0483:3748:2B4907如果你更换了探针序列号,把 --probe 换成你自己的设备即可。
lsusb -d cafe:4009插入设备后应能看到键盘和鼠标事件节点:
ls -l /dev/input/by-id | grep -i ultralink典型结果会包含:
...if02-event-kbd...if03-event-mouse
fido2-token -I /dev/hidrawXfido2-token -S /dev/hidrawXfido2-token -S -l 6 /dev/hidrawXfido2-token -S -u /dev/hidrawXfido2-cred -M -h -i cred_param /dev/hidrawX es256
fido2-cred -V -h -i cred_out -o cred_pub es256
fido2-assert -G -h -p -i assert_param /dev/hidrawX
fido2-assert -V -h -i assert_out cred_pub es256fido2-cred -M -b -i cred_param /dev/hidrawX es256
fido2-assert -G -b -p -i assert_param /dev/hidrawXfido2-token -I /dev/hidrawX预期会看到:
extension strings: ... largeBlobKeytransport strings: usbalgorithms: es256 (public-key)maxcredcntlst: 64maxcredlen: 32maxlargeblob: 3824
UART4 用于控制 USB HID 键盘 / 鼠标。当前命令解析在主循环全局启用,不依赖 LCD 当前页面;即使没有进入 输入设备 页面,也会接收串口命令。
UART41152008N1- TX:
PA0 - RX:
PC11 - 行结束:
\r、\n或\r\n
建议上位机每条命令前发送一次 0x18,用于清掉可能残留的半行命令。固件收到 0x03、0x18 或 0x1B 会清空当前输入行。
每解析一条非空命令行,设备会返回状态行:
AKM OK RX=35 CMD=2 KEY=1 MOU=1 Q=2 DROP=0 LAST=hid 0 4
字段含义:
RX:串口累计接收字节CMD:累计解析命令数KEY:累计发送键盘 report 数MOU:累计发送鼠标 report 数Q:待发送 HID report 队列深度DROP:队列满或命令过长导致的丢弃次数LAST:最后一条命令摘要
按键组合:
key a
key SHIFT+a
key CTRL+ALT+DEL
key ENTER
key ESC
key F8
短别名:
k a
k SHIFT+UP
输入一段 ASCII 文本:
type hello-123
t hello
直接发送 HID usage:
hid 0 4
usage 0 4
0 4
其中 hid 0 4 和裸格式 0 4 都表示修饰键 0x00、usage 0x04,即 a 键。
常用修饰键位:
CTRLSHIFTALTGUI/WIN/META
常用功能键名:
ENTER/RETESC/ESCAPEBACKSPACE/BSPTABSPACEUP、DOWN、LEFT、RIGHTHOME、END、PGUP、PGDNINS、DELF1到F12
释放键盘和鼠标状态:
release
r
相对移动:
m 20 0 0
m -10 5 0
m 0 0 1
格式为:
m <dx> <dy> <wheel>
单次点击:
click left
click right
click middle
c l
设置鼠标按钮位:
btn 1
btn 0
p 1
p 0
按钮位定义:
1:左键2:右键4:中键
Qt/DTK 串口键鼠工具当前在仓库外部:
/home/hao/link/A/ui
它会选择串口后发送上述命令。该目录不是本 firmware 仓库的一部分,如果需要一起发布,需要单独纳入仓库或创建独立仓库。
- 旋钮:菜单选择
- 短按:确认 / 删除 / 清空 / FIDO 确认
- 长按:返回
板上提供:
安全密钥删除密钥清空密钥SPI 闪存输入设备USB 调试
输入设备 页面用于查看 UART HID 键鼠状态,不是串口接收的开关。串口命令在设备启动后全局可用。
- Windows Hello 的
PIN / reset管理链已经推进,getInfo与bio preview getInfo的预检兼容也已补;但“直接作为 Windows 账户登录密钥”的兼容还没有完全收口。当前 Windows 仍可能提示“无法读取你的安全密钥,请重试”。 authenticatorLargeBlobs命令面已经实现,当前maxlargeblob = 3824。- 更完整的
credMgmt、更完整的 CTAP2.1 扩展仍在继续补。 - 当前文档以 Linux 开发和调试流程为主。