多角度对齐分析:ws63-rs HAL ↔ C SDK ↔ SVD(QEMU 为交叉验证台)
目标:用 ws63-qemu 同时运行 ws63-rs(Rust 裸机)与 fbb_ws63 C SDK(厂商 gcc)两侧固件, 在「外设寄存器布局/时序」「内存映射」「启动」「中断」多个维度交叉验证 ws63-rs HAL 的正确性。
方法(四方对齐)
| 来源 | 角色 |
|---|---|
ws63-pac/ws63-svd/WS63.svd | 寄存器布局的「名义真值」(厂商 SVD;svd 现为 ws63-pac 的嵌套子模块) |
ws63-hal(Rust) | 被验证对象:ws63-rs 的 HAL 驱动 |
fbb_ws63(C SDK) | 权威参照:厂商在产硬件上验证过的驱动 |
| ws63-qemu 运行时 | 交叉验证台:QEMU 外设模型按 SVD + rs HAL 建模;若 C SDK 固件在同一模型上也能正确工作,则证明 rs HAL 的寄存器模型与 C SDK 一致 |
运行时交叉验证是最强证据:QEMU 的 UART/timer/中断/内存模型源自 rs HAL + SVD;而厂商 gcc 编译的 C SDK 固件(flashboot、ws63-liteos-app)在同一模型上跑出正确 UART 输出、定时器中断、启动流程 ——等于用厂商实现反向核验了 rs HAL。
UART(最强对齐,两侧均经此打印)
| 寄存器 | SVD / rs HAL (uart.rs) | C SDK (hal_uart_v151_regs_def.h) | QEMU 模型 (ws63.c) |
|---|---|---|---|
data(RX 读/TX 写) | 0x04 | 0x04(intr_id@0x00, data@0x04) | UART_DATA 0x04 |
line_status | 0x34 | 0x34 | UART_LINE_STATUS 0x34 |
fifo_status | 0x44(tx_full[0]/tx_empty[1]/rx_full[2]/rx_empty[3]) | 0x44 | UART_FIFO_STATUS 0x44,同位定义 |
- TX 时序一致:rs HAL
write_byte轮询fifo_status.tx_fifo_full(0x44 bit0) 为 0 → 写data(0x04); C SDKhal_uart_v151经hal_uart_is_tx_fifo_full(读fifo_status)+hal_uart_get_data_register(&->data) 同序。 - 关键结论:WS63 UART 不是 16550(
data在 0x04 而非 0x00;自定义fifo_status@0x44)—— rs HAL、C SDK、SVD 三方一致,且两侧固件在 QEMU 同一模型上打印成功 → rs HAL 的 UART 寄存器模型正确。
时钟 / TCXO
- TCXO 计数器
0x440004C0(bit4 count-valid + 64 位计数 +0x04/+0x08):C SDKhal_tcxo(flashboot) 实际使用,QEMU 据此建模后 bootloader 时钟 bring-up 通过。rs HAL 已对接——ws63-hal/src/tcxo.rs的TcxoDriver用同一「写 refresh 锁存 → 等 valid 标志 → 读 count0..count3」过程读 64 位计数, 与 C SDK / QEMU 模型一致。 - SYS_CTL0 时钟状态(TCXO/PLL 锁,
0x40000000):两侧init_clocks均经此,QEMU 模型同时满足。
定时器 / 中断
- TIMER_0 → IRQ 26:rs 示例
timer_irq与 C SDKradar_timer_init([RADAR_LOG] radar_timer_init succ) 都用 IRQ 26(标准mie位 + 向量化 mtvec)——两侧在 QEMU 同一中断模型上闭环,IRQ 号与投递路径对齐。 - IRQ≥32(自定义
LOCIxx本地中断):rs 示例gpio_irq(GPIO0→IRQ 33)验证;C SDK 同走该通路。 机制见 中断控制器设计。
内存映射 / 启动
- BOOTROM/ROM/ITCM/DTCM/FLASH/SRAM 布局(
ws63-rt/memory.x↔ C SDKmemory_config_common.h)一致: 两侧固件在同一 QEMU 内存映射上正确 relocation/启动(rs blinky 等;C SDK app 完成 relocation/dyn_mem_cfg)。 - 外设基址(UART
0x4401_x000、TIMER0x4400_2000、GPIO0x4402_8000、SFC0x4800_0000、EFUSE0x4400_8000) :SVD ↔ C SDK 头文件 ↔ rs HAL/PAC 三方一致。详见 内存映射。
发现与差异
- ✅ UART/timer/中断/内存映射/外设基址:rs HAL 与 C SDK 完全对齐(同寄存器、同位、同时序),运行时双向验证。
- ✅ TCXO 计数器:C SDK 与 rs HAL(
ws63-hal/src/tcxo.rs的TcxoDriver)都用0x440004C0的 64 位 自由计数(同 refresh→valid→读过程),与 QEMU 模型一致。 - 🟡 指令集:C SDK 用 HiSilicon xlinx 自定义指令(GCC),rs 用标准 rv32imfc——功能等价,密度不同 (见 Rust 工具链是否需要 xlinx)。
- ⬜ flash/NV/efuse 内容:需真实分区/标定数据(无 dump),属数据墙而非寄存器布局差异(见 已知边界)。
总评:在已建模的外设维度上,ws63-rs HAL 的寄存器布局与时序与厂商 C SDK 一致,并经「两侧固件跑在 同一 QEMU 模型」运行时交叉验证(含 TCXO 64 位计数器,两侧均已对接
0x440004C0)。剩余差异是 xlinx 指令密度(功能等价)与 flash/NV/efuse 标定数据墙——均非寄存器布局问题。