一个基于 sf32lb52 模组的嵌入式游戏/演示工程(PocketPi)。此仓库包含源代码、构建脚本与运行所需的资源目录。
git clone https://github.com/SiFliSparks/PocketPi.git
切换到project目录,运行scons命令执行编译:
scons --board=sf32lb52-lchspi-ulp -j32
运行build_sf32lb52-lchspi-ulp_hcpu\uart_download.bat,按提示选择端口即可进行下载:
build_sf32lb52-lchspi-ulp_hcpu\uart_download.bat
Uart Download
please input the serial port num:5
烧录并启动设备后,固件会自动扫描设备上的 disk/ 目录,列出目录中的可运行文件。请注意以下要点:
- 在构建或调试时,用户需自行准备要运行的 ROM/二进制文件并把它们放入仓库根的
disk/目录中(请勿将受版权保护的 ROM 提交到仓库)。 - 启动后,设备会扫描
disk/并在界面上显示文件列表。你可以在列表中选择某个文件并运行它。
示例流程:
- 在本地把测试用 ROM 拷贝到
disk/目录。 - 启动设备,等待主界面扫描完成并显示列表。
- 在界面中选择要运行的文件并确认,设备会载入并运行该文件。
仓库中主要文件和目录说明:
disk/:运行时扫描的资源目录,放置本地测试用的 ROM/二进制文件,请勿提交受版权保护的 ROM。project/:构建脚本、板级配置和生成的构建产物。src/:工程源代码(C 源文件、第三方库子目录等)。assets/:示例图片和运行截图。.gitignore:忽略规则,已配置为忽略构建输出和常见 ROM 文件扩展名。README.md:工程介绍与使用说明(本文件)。
通常流程:编辑 disk/(放入本地测试文件)→ 运行 scons 构建 project/ → 通过下载脚本烧录并在设备上选择运行。
本工程把游戏按键通过外部引出的 GPIO 实现,相关实现位于 src/video_audio.c(部分行为在 src/main.c 中被调用)。
-
按键硬件定义:
- 按键 GPIO 数组:
int key_pin_def[] = {30,24,25,20,10,11,27,28,29};(共 9 个按键,板上使用上拉输入)。
- 按键 GPIO 数组:
-
扫描与去抖:
- 使用 200 Hz 的软件定时器周期性调用
key_scan()。 - 每个按键用 8-bit 移位缓冲做去抖:连续读到
0xFF判定为按下,连续0x00判定为释放。
- 使用 200 Hz 的软件定时器周期性调用
-
按键索引到功能的映射(索引 0..8):
-
按键索引与 GPIO、功能(表格):
| 索引 | GPIO 引脚 | 按键名称 | 说明 | Select+组合键(按住 Select 时) |
|---|---|---|---|---|
| 0 | 30 | Select | 主组合键,用于触发系统级快捷操作 游戏Select键 | — |
| 1 | 24 | 未使用 | 当前未分配功能 | — |
| 2 | 25 | Start | 游戏 Start 按键 | Select + Start → 触发退出(调用 trigger_quit()) |
| 3 | 20 | B | 游戏 B 按键 | Select + B → 读取存档(调用 state_load()) |
| 4 | 10 | A | 游戏 A 按键 | Select + A → 保存存档(调用 state_save()) |
| 5 | 11 | Up | 上 / 菜单上 | Select + Up → 降低音频 shift(audio_shift_bits--) |
| 6 | 27 | Right | 右 / 菜单右 | Select + Right → 切到下一个存档槽(selectedSlot++,并调用 state_setslot()) |
| 7 | 28 | Left | 左 / 菜单左 | Select + Left → 切到上一个存档槽(selectedSlot--,并调用 state_setslot()) |
| 8 | 29 | Down | 下 / 菜单下 | Select + Down → 增加音频 shift(audio_shift_bits++) |
说明:表中“Select+组合键”均由 ConvertGamepadInput() 中的逻辑判定,判定条件为“Select(索引 0)持续按住且目标键产生按下事件(press event)”。
-
按键事件与仿真输入的关系:
- 实际送入仿真的按键位由
ConvertGamepadInput()返回的位掩码控制,再由osd_getinput()中的事件表映射到具体的event_回调,从而驱动行为(例如 joypad、soft_reset、hard_reset 等)。
- 实际送入仿真的按键位由
-
接线与修改建议:
- 接线建议:按键一端接对应 GPIO(参考
key_pin_def中的编号),另一端接地;GPIO 使用上拉,按下为低电平。 - 如果要改变按键对应的功能或组合行为,请修改
src/video_audio.c中的key_pin_def(改变物理引脚)和/或ConvertGamepadInput()(改变按键到事件的映射与组合逻辑),然后重新编译固件。
- 接线建议:按键一端接对应 GPIO(参考
-
调试与命令:
- 可以使用
MSH_CMD_EXPORT导出的命令(例如key_set、tev、trigger_quit)进行简单调试;key_set可用于在运行时注入key_state值来模拟按键输入。
- 可以使用
以上说明基于 src/video_audio.c 中的当前实现(包含保存/加载/切槽/退出/音频调整等组合键)。
Q: 游戏列表中没有文件?
A: 请确保你已经把测试用的 ROM/二进制文件放入了 disk/ 目录,并且这些文件的扩展名是受支持的(例如 .nes)。如果目录为空或没有受支持的文件,列表将不会显示任何内容。
如果你遇到任何问题或有改进建议,请在仓库的 Issues 页提交问题: https://github.com/SiFliSparks/PocketPi/issues

