前面看到平头哥有支持 QEMU,心想这下可有救了,继上文云共享 W800 开发板项目废弃之后,就有又可以找到一种新的思路来简单无开实际开发板运行 W800 固件了。
回想19年的时候,想基于 W600 制作一款模拟器,选择了QEMU,当时起草了 machine 后,想到有那么多的外设需要模拟,感觉功力不甚够,后来慢慢就搁置了,最后只是搞了个另种实现,而现在搞出了 W80X 模拟器之后我终于实现了当年愿望,哈哈哈。
话不多说,经过我的打造,现在制作了一款适用于 W80X 系列 SoC 的模拟器,可以模拟 W80X 的众多功能和外设, 成功运行大多数的固件。
经过后续的持续改进,增加更多的外设模拟,当前已经支持的外设有:
1. UART,支持了 6 路串口,仅提供输出 LOG 和输入指令这种简单使用。
· TX - PB19
· RX - PB20
2. DMA,支持内存到内存,支持部分设备使用内存到设备、设备到内存功能。
3. Timer,支持 6 路 Timer,不过毕竟是模拟的,精度还是不足。
4. 通用加密模块(只实现了 MD5 和 CRC32 的部分算法)
5. 片上 Flash(128M),带有合法出厂参数。
6. PSRAM(8M),没有真实设备上的使用限制。
· CK - PB0
· CS - PB1
· D0 - PB2
· D1 - PB3
· D2 - PB4
· D3 - PB5
7. SDMMC,可使用 qemu-img 工具生成一个模拟 SD 卡的镜像当作 SD 卡使用。
· CLK - PB6
· CMD - PB7
· DAT0 - PB8
· DAT1 - PB9
· DAT2 - PB10
· DAT3 - PB11
8. Watchdog,触发后产生设备复位运行效果。
8. SDIO SPI 模式驱动 TFT-LCD 屏,支持 NV3041A 屏(480x272 分辨率)
· BLK - PA2
· RST - PA7
· CLK - PA9
· MOSI - PA10
· CS - PA14
· DC - PA12
9. GPIO,设计了 5 个 GPIO 按键,触发后可产生相应中断。
· key1 - PA0
· key2 - PB16
· key3 - PB18
· key4 - PB21
· key5 - PB22
10. RGB 三色灯,可以单独控制,也可以一起控制。
· red - PB24
· green - PB25
· blue - PB26
11. Ethernet,无需任何设置可直接以 NAT 方式使用以太网络,当然真实的 W80X 是没这功能的,这是我为模拟器特别提供的网络能力,毕竟模拟 Wi-Fi 难度还是挺大的,而以以太网提供网络却比较成熟。
12. I2C,挂接了一块 AT24C256 的 eeprom,设备地址 0x50,可以读取和保存数据,退出不会丢失数据。
挂接一块 SHT30 传感器,设备地址 0x44,当然采集到的数据是随机产生的。
· scl - PA1
· sda - PA4
13. ADC,设计了一个 NTC 电阻 MF52-103,参考电压 3.3v,分压电阻 100k。计算公式是我从网上找的,毕竟作为示例练习也够用了。
· ADC2 - PA3
14. RTC,支持实时时钟和闹钟功能。
15. 支持 PWM 功能,仅实现了独立输出模式工作,当然毕竟是模拟的,精度也差强人意。也可以用来驱动上述的 RGB三色灯,使用 PWM2、PWM3、PWM4 这三个通道控制。
16. BEEP,添加了一个蜂鸣器,可以通过 GPIO 控制它;
17. I2S,增加了 CODEC 适配,可以直接播放音频。
后面可能会继续模拟实现 Wi-Fi、BLE 等更多功能。
考虑到实际使用,我直接制作了一款基于 W802 芯片的虚拟开发板:
其板载了 128M 片内 Flash、8M 的 PARAM、AT24C256、SHT30、MF52-103、5 个 GPIO 按键、1个 RGB 三色灯、1个以太网、1个 SD 卡座、NV3041A TFT-LCD 屏、I2S Codec 等外设,也具备 JTAG 调试能力,可以和实际设备一样进行开发。
为了方便使用,我特意添加了一个工程 w802_virt_board,可以在此工程里使用上述的各种外设。
可以观看视频了解用法:
再用直白点的话说,就是我现在制作了一款在 Windows 系统上使用的 W80X 模拟器,它可以让你不需要开发板,直接运行其固件。比如,你可以直接下载 WMSDK,编译出一个 hello world 固件,然后不需要找啥开发板进行下载,只需要运行模拟器就可以看到固件运行效果了。理论上,这对于学习嵌入式代码编写比较方便,可自行思考用途。
使用时,当编译之后之后就可以得到固件 .fls 文件,为了方便调试还需要 elf 文件,可以在编译的临时文件夹中找到 elf 文件,然后用模拟器加载它。命令格式为:
w80x -elf "elf file path" -img ".fls file path"
为了简化输入,也可以在 WM IoT SDK 的工程下使用快速启动命令:
w80x -prj
固件直接就跑起来了,同时打印出了信息。
退出的话,一般按一下 ctrl + c 键即可退出。
如果想使用sd卡的话,运行时需要增加参数"-sd your-sd-card.img"。
其实不止是可以只看打印信息,可以通过串口做交互。像 W800 的 AT 指令固件,也是可以通过 UART0 进行操作的,那么就可以向其发送 AT 指令,如上图。
此外,这也可以搭配 gdb 做单步调试(就像使用真实设备时候的 JTAG 一样)。只需在执行固件时用如下命令:
w80x -elf "..." -img "..." -gdb tcp::1102 -S
然后,另外找个地方,启动gdb:
csky-elfabiv2-gdb w800.elf
在 gdb 里执行 target remote :1102 ,此时就会进入调试模式,固件当前处于启动后的挂起状态,可以通过 gdb 指令进行调试了,此处不在介绍,感兴趣的可以自行研究。
最后提供模拟器的下载:---> w80x_sim.7z。