
用 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),僅供參考