W80X 模拟器 / W802 虚拟开发板(适用于W800/W801/W806...)
时间:2024年07月28日 人气:...

前面看到平头哥有支持 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

热门评论