ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

用 Flipper Zero 当复古手柄:RC2014 ColecoVision 控制器应用与接口模块全解析

用 Flipper Zero 当复古手柄:RC2014 ColecoVision 控制器应用与接口模块全解析 用 Flipper Zero 当复古手柄RC2014 ColecoVision 控制器应用与接口模块全解析【免费下载链接】FlipperPlayground (and dump) of stuff I make or modify for the Flipper Zero项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper本文基于本仓库 rc2014_coleco 模块完整讲解如何让 Flipper Zero 化身 ColecoVision 游戏手柄通过自制的 RC2014 接口模块控制运行在 RC2014 复古计算机上的 ColecoVision 游戏。你将掌握其硬件架构Eagle 原理图 GPIO 连接、键码协议、应用源码的信号链路以及从零构建并部署.fap应用的完整流程。上图是应用运行时的界面截图左侧为完整的按键矩阵1-9、*、0、#上方是 ALT 键左侧是摇杆与 Fire 按键区域整体复刻了 ColecoVision 手柄「摇杆 电话键盘」的经典布局。项目定位一套软件 硬件的完整手柄方案这个模块由两部分组成二者缺一不可Flipper Zero 应用一个在 Flipper Zero 上运行的 GUI 程序FAP负责把按键输入转换为 ColecoVision 控制器信号并通过 GPIO 引脚输出RC2014 接口模块一张插在 RC2014 总线上的扩展板负责把 Flipper Zero 引出的信号按 ColecoVision 控制器端口协议翻译给主机读取。从源码入口 coleco.c 可以看到应用启动后会注册全屏 ViewPort、初始化全部 GPIO 输出引脚并调用furi_hal_power_enable_otg()开启 5V 供电——也就是说接口模块的电源也可以直接由 Flipper Zero 提供无需额外供电。前置条件在 RC2014 上跑起 ColecoVision 游戏原文档明确指出本模块只解决手柄这一环运行游戏本身需要一套完整的 RC2014 复古游戏栈一台RC2014标准总线背板J. B. Langston 的 TMS9918A 视频卡模块提供 ColecoVision 所需的 TMS9918A 显示芯片配合 VDP 内存负责画面输出J. B. Langston 的 SN76489 声卡模块提供 SN76489 音频芯片负责声音输出某种能加载并启动 ColecoVision ROM 的方式如 ROM 加载器或相应的软件方案。一个重要的硬件坑如果使用标准的可分页 ROM 模块例如 RC2014 标准 Pro 套件自带的那个必须对其进行改造否则 TMS9918A 模块无法工作在 ColecoVision 所使用的端口地址上。原文档引用了 TMS9918A 仓库的 issue #12 讨论此改造方案动手前务必先完成这一步否则后续调试会寸步难行。硬件方案两块板子各司其职RC2014 接口模块双玩家端口译码接口模块的原理图与 PCB 文件位于 interface 目录flipper-coleco.schEagle 原理图flipper-coleco.brdEagle 版图从原理图内容可以确认模块的总线连接方式它通过RC2014BUS符号挂接 RC2014 背板总线用到了A0–A15 地址线、D0–D7 数据线、WR写选通、IORQI/O 请求、M1 以及 VCC/GND核心译码逻辑由多片74LS138 三线八线译码器/多路分配器完成负责把两个玩家的控制器端口地址逐一译码选通。按原文档描述该模块完成的功能是处理两位玩家P1/P2的控制器端口寻址将8 条数据线输入和模式选择线mode select引出到板载接口由于把数据线单独引出这块板实际上可用于不同的控制器实现比 ColecoVision 官方规格更灵活ColecoVision 原版手柄的按键复用同一组数据线通过不同地址读回。Flipper Zero 侧 GPIO 板硬件多路复用RC2014 接口模块引出的是 8 条数据线而 Flipper Zero 可用的 GPIO 数量有限因此还需要一块GPIO 复用板用硬件多路复用的方式让 Flipper Zero 驱动这 8 条数据线。原文档注明该 GPIO 板的原理图即将补充到仓库截至本文所基于的仓库版本接口目录中只有 RC2014 侧模块的.sch/.brd。在等待 GPIO 板原理图期间可以从 coleco.c 的引脚定义反推 Flipper Zero 侧需要的连接信号功能Furi HAL GPIO 描述符说明上Upgpio_ext_pa6方向输入下Downgpio_ext_pc0方向输入右Rightgpio_ext_pb2方向输入左Leftgpio_ext_pc3方向输入键码位 0code0gpio_ext_pa74 位键码最低位键码位 1code1gpio_ext_pa44 位键码键码位 2code2ibutton_gpio4 位键码iButton/1-Wire 引脚键码位 3code3gpio_ext_pc14 位键码最高位Fire开火gpio_ext_pb3扳机/开火输入ALT功能键gpio_usart_tx模式选择/ALT 键这些均为 Furi HAL 提供的GpioPin描述符对应 Flipper Zero 正面 GPIO 排针上可用的扩展引脚其中ibutton_gpio复用 iButton 引脚gpio_usart_tx复用 UART TX 引脚需要 GPIO 复用板妥善分配。应用源码剖析从按键到数据线的信号链路ColecoVision 键码4 位数据线上的协议ColecoVision 手柄的按键并非简单地一根线一个键而是通过4 条数据线编码成一个 4 位键码nibble。源码 coleco.c 中定义了完整的键码表按键键码十六进制二进制bit3..bit000x0A101010x0D110120x07011130x0C110040x02001050x03001160x0E111070x05010180x01000190x0B1011#Pound0x060110*Star0x091001无键按下空闲0x0F1111键码通过 coleco_write_code() 写往 4 条数据线——它依次把code 1、code 2、code 4、code 8写到 code0~code3 引脚上实现逐位并行输出static void coleco_write_code(uint8_t code) { furi_hal_gpio_write(pin_code0, (code 1)); furi_hal_gpio_write(pin_code1, (code 2)); furi_hal_gpio_write(pin_code2, (code 4)); furi_hal_gpio_write(pin_code3, (code 8)); }注意空闲码是0x0F全部为 1结合初始化代码可以看出整套信号是低电平有效active-low引脚默认输出高电平按键按下时对应位被拉低。初始化与电源管理coleco_gpio_init() 完成三件事将全部 10 个引脚配置为推挽输出GpioModeOutputPushPull、无上下拉GpioPullNo、超高速GpioSpeedVeryHigh将所有信号线初始化为高电平空闲态写入空闲键码CODE_N0x0F。应用主循环中通过furi_hal_power_enable_otg()开启 OTG 5V 输出为外部硬件供电退出时调用furi_hal_power_disable_otg()关闭保证不使用时外部电路不带电coleco.c、coleco.c。两种操作模式应用内置了两种操作模式通过按键交互切换状态保存在结构体Coleco的dpad标志中coleco.c模式一按键矩阵模式默认dpad false界面上呈现一个 4×3 的按键矩阵1-9、*、0、#外加顶部的 ALT 键和左侧的摇杆入口。光标初始位于摇杆单元格row 0, column 1。此模式下Flipper 按键行为上 / 下在矩阵列之间移动光标列范围 0~2左 / 右在矩阵行之间移动光标行范围 0~4OK选中根据光标位置执行对应动作选中 1-9、*、0、# 时写入对应键码选中 ALT 时拉低pin_alt选中摇杆单元格时切换进入摇杆模式OK释放恢复 ALT 为高电平并写回空闲码CODE_NBack退出应用模式二摇杆/方向键模式dpad true按下 OK 进入后方向与开火按键被直接映射到硬件信号线与真实手柄行为一致Flipper 按键行为上 / 下 / 左 / 右按下时拉低对应方向线释放时恢复高电平OK按下时拉低pin_fire开火释放时恢复高电平Back退出摇杆模式返回按键矩阵模式两套逻辑的关键区别在于按键矩阵模式写的是4 位键码协议层摇杆模式操作的是单根方向线物理层——这正对应 ColecoVision 手柄中方向摇杆 电话键盘双区域的硬件结构。UI 渲染与事件循环界面渲染由 render_callback() 完成在 128×64 全屏 ViewPort 上绘制摇杆图标33×33、Fire 按钮、ALT 键以及 17×17 的 12 个按键图标。仓库 icons 目录中为每个按键都提供了普通与高亮_hvr两套图标渲染时根据当前光标位置row/column动态选择实现选中即高亮的交互反馈。事件循环基于FuriMessageQueue容量 8 条驱动GUI 层把输入事件投递到队列主循环每 100ms 轮询一次处理InputKeyUp/Down/Left/Right/Ok/Back事件后调用view_port_update()刷新画面coleco.c。状态共享通过ValueMutex互斥锁保护渲染线程与输入线程之间不存在数据竞争。构建与安装 FAP构建清单application.famFAP 的构建清单位于 application.fam关键字段如下字段值说明appidRC2014_Coleco应用唯一标识nameRC2014 ColecoVision应用显示名称apptypeFlipperAppType.EXTERNAL外部应用FAPentry_pointcoleco_app入口函数requires[gui]依赖 GUI 服务stack_size1 * 10241 KiB 栈空间fap_iconcoleco_10px.pngFAP 图标fap_icon_assetsicons图标资源目录fap_categoryGPIO归类到 GPIO 类别其中入口coleco_app即 coleco.c 中的int32_t coleco_app(void* p)fap_icon_assets指向的 icons 目录会被 fbt 自动编译为图标头文件RC2014_Coleco_icons.h供渲染代码引用。编译步骤fbt 流程原文档给出的标准构建流程以官方 flipperzero-firmware 为环境克隆固件源码克隆flipperzero-firmware仓库构建 FAP 所需的完整 SDK 环境。建立符号链接在固件仓库的applications_user目录下创建名为coleco的符号链接指向本模块所在目录例如ln -s /path/to/rc2014_coleco /path/to/flipperzero-firmware/applications_user/coleco编译 FAP./fbt fap_colecofbt 会根据符号链接发现应用并完成编译。部署到 SD 卡将产物build/f7-firmware-D/.extapps/coleco.fap复制到 SD 卡的apps/Misc目录可直接拷贝或通过 qFlipper 文件管理器上传。应用启动后入口即位于 Flipper Zero 的 Apps 菜单中。需要说明的是原文档步骤 4 指示放到apps/Misc而 application.fam 声明fap_categoryGPIO实际归类以所用固件版本对 FAP 类别的处理为准必要时按固件实际生成的目录结构放置。仓库文件速览文件/目录作用coleco.c应用主程序GPIO 驱动、键码协议、输入处理与 UI 渲染application.famFAP 构建清单interfaceRC2014 接口模块的 Eagle 原理图与版图icons界面图标资源按键、摇杆、ALT/Fire 的普通与高亮两套coleco_10px.pngFAP 应用图标ui.png应用运行界面截图README.md原始文档小结把 Flipper Zero 变成 ColecoVision 手柄本质是完成一条按键 → 键码/方向信号 → RC2014 控制器端口的完整链路软件侧由 coleco.c 负责按键解析、4 位键码写入与 GPIO 驱动硬件侧由 interface 的 74LS138 译码电路负责端口寻址。对于想复刻或改造的开发者建议按先确认 TMS9918A 端口改造 → 制作/获取两块板子 → 构建 FAP → 联调信号的顺序推进并在动手前仔细对照本文的引脚映射与键码表。【免费下载链接】FlipperPlayground (and dump) of stuff I make or modify for the Flipper Zero项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表