【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    曾在 2017 年寫過一篇文章「親手打造任天堂紅白機遊樂器」體驗 DIY 的樂趣之後,相信「紅白機掌機化」是有搞頭的。不久之後創客圈出現了「ODROID-GO」這種 DIY 掌上型遊戲機,但據說體驗極差,又不夠便宜(USD $32),所以很快就 Discontinued 消聲匿跡了。近年來「紅白機掌機化」方案有如雨後春筍般的紛紛冒出,但基於更好的遊戲體驗與操作手感為由,這類開源掌機始終存在一定的體積和重量,很難方便直覺的收納在身上任何一處口袋並隨時掏出來玩。時間來到 2020 年,「紅白機掌機化」總算迎來真正意義上的實現,紅白機本家廠商「任天堂」,以「35 週年活動」為由,於 2020 和 2021 年,先後發表「超級瑪莉兄弟」與「薩爾達傳說」兩款 Game&Watch 遊戲掌機,日幣 4,980 円,台灣官方的定價 1,450 元。 (官網註明「超級瑪利歐兄弟」款式已於 2021 年 3 月 31 日結束生產)

    Game&Watch 掌機WIKI)是 1980 ~1991 年之間,由任天堂推出的掌上型遊戲機,上市年代比紅白機更為久遠,在當時的學齡人口之間廣為流行,如今已是許多中年成人的童年回憶。「35 週年活動」發表的兩款 Game&Watch 更是完全復刻當年的外型風格,外觀尺寸 67mm x 112mm x 12.5mm,比成年人的手掌略小,重量僅 68 克,可輕鬆放入身上任何一處口袋。遊戲內容則是各自挑選了幾款紅白機與昔日 Game&Watch 的經典代表作,薩爾達款更多了 GameBoy 和新的計時小遊戲,機體外觀上薩爾達款也比瑪莉歐款多兩顆按鈕。在 Game&Watch 掌機框架上遊玩紅白機遊戲,又是任天堂本家公司的產品,可說是 100% 根正苗紅、血統純正,真正意義上「紅白機掌機化」的最佳方案。唯一的遺憾是,收錄的內置遊戲實在太少了,所以這款產品的收藏價值遠大於實用性,估計這也是廠商滿滿的套路,說不定哪天「寶可夢 N 週年活動」、「星之卡比 N 週年」,或是跟某 K 遊戲商一起來合搞「惡魔城 N 週年」、「魂斗羅 N 週年」等等,再以相同手法推出對應的 Game&Watch 掌機,一次又一次收割中年韭菜的懷舊之情,屆時也不意外。

    坦白說 1,450 元的定價,只能玩特定幾款遊戲,又是「限定發行」,本來對我沒什麼吸引力。差不多在今年 9 月上旬的時候,臉書社團的人分享摸摸電商的消息,Game&Watch 薩爾達款出現歷史低價只要 888 元,然後又很不小心 G (Google) 到這台掌機的「黑工玩法」,加上當時又有信用卡與電商合作贈送的 100 元折價券,各種敗家誘因的驅使之下,忍不住就剁手了,以 788 元購入一台來搞搞看。

    G 過才知道,「35 週年活動」Game&Watch 掌機經由某些黑工改造之後,不僅能玩紅白主機遊戲,還能玩上 PC-Engine、SEGA MegaDrive、Game Gear、GameBoy … 等其他平台的遊戲。若對自己的焊工手藝有點自信的話,還能擴增內置空間,搞出「原廠+自製」雙系統來玩玩。由於 G 到的相關黑客工具有些已經更新,發現大部分網路教程如今已經有點過時,或是有些沒寫清楚的,所以自己也來寫篇教學文章更新一下。

    本文內容主要分成以下幾個部分:

    1. 前置作業概述
    2. 安裝 OpenOCD 與 ToolChain 工具,gnwmanager 管理套件、環境參數設置
    3. 備份原廠韌體、解鎖 Game&Watch、還原原廠韌體
    4. 編譯安裝自製韌體(retro-go 客製化模擬器)
    5. 擴充 Game&Watch 內置記憶體容量
    6. 原廠與 retro-go 雙系統:必須擴充容量後才能使用
    7. 額外補充:轉換成 retro-go 可運行的 Game&Watch 遊戲

    準備工具:

    • 人字螺絲起子:拆解 Game & Watch 
    • 杜邦線三條:連接樹莓派(或 ST-LINK)與 Game & Watch 掌機
    • 樹莓派,或是 ST-LINK 讀寫器:連接 Game & Watch 掌機並上傳韌體。本篇文章所使用的 ST-LINK 是 V2 版。 
    • USB Type-C 電源供應器:Game&Watch 上傳韌體的過程中,有些時候必須斷電重開機(power-cycle),所以要斷開鋰電池,改以 Type-C 供電。 若想偷懶的話,可以直接用電腦或樹莓派的 USB 埠作為 Game&Watch 的 Type-C 供電來源。
    • 一台 Linux 的電腦:用來編譯 Game&Watch 的客製化韌體,樹莓派安裝官方 Raspbian 32bit OS 亦可視為 Linux 電腦。若要以虛擬機安裝 Linux ,不建議使用 Paralkels Desktop,因為 ST-LINK 不能跳接至虛擬機內。
    • 電腦一台(可選):整理 ROM 檔、安裝樹莓派作業系統,或是連線到樹莓派下指令之類的雜項用途。

    所需技能:

    • 基本的 Linux 指令操作、小螺絲起子拆解物品。

    如果要搞雙系統,需求如下:

    • 晶片拆解與焊接工具:焊槍或熱風槍,以及其他相關工具(鑷子、焊錫/錫油/錫膏…)。
    • Flash 記憶體晶片 16MB 或 32MB 或 64MB:看個人的需求,三種容量的 Flash IC 有兩種外觀。32MB 與 64MB 可能需要熱風槍。型號後文中詳述。

    個人覺得不搞雙系統的話難度不高,對於常玩樹莓派、或是習慣使用 Linux 的人來說,這種難度根本是小菜一碟,僅需具備一點點 Linux 系統下操作指令的基礎即可。而雙系統的難度,主要在於個人的焊工手藝,不是每個人都會拿焊槍,不過對我個人來說這部分難度也不高,比上次 GPi Case 更換晶片的難度偏低許多。這次改機除了倒楣買到故障的 ST-LINK V2,其他一切都很順利,幾乎沒踩到什麼坑。

    若對以上的部分沒啥問題,想繼續看下去的話,底下的內容可能很長,請繫好安全帶,要發車了。

    1、前置作業概述

    「35 週年活動」Game&Watch 掌機不能外插記憶卡,Type-C 口也只有充電功能,想對它上下其手的話,必須先脫了它的…外殼。不過 Game&Watch 外殼由 4 顆特製的人字螺絲固定,得用特殊工具拆解,所幸這種螺絲與任天堂 Switch 主機 Joy-Con 手把的外殼螺絲一模一樣,還相同都是鋁製螺絲,很容易崩牙。受惠於 Joy-Con 的高銷量與高維修率,網路賣場搜尋「Joy Con 維修工具」會跑出一大堆,價格也很便宜。建議買一整組的(人字、十字、鑷子、翹棒),在本文中這 4 個工具全都用得上。

    人字:拆裝外殼螺絲。十字:主板拆裝。鑷子:排線固定、更換 Flash 晶片。翹棒:撬開鋰電池接頭、螢幕排線黑色壓版。

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    拆開之後還可發現 Game&Watch 使用的喇叭與 Nintendo Switch 同款,鋰電池也和 Joy-Con 同款。受惠於 Nintendo Switch 與 Joy-Con 的高銷量與高維修率,將來 Game&Watch 電池跟喇叭故障也不用擔心,很容易買得到零件更換。上面提到易崩牙的人字鋁製螺絲,也能找到鐵製十字的替代品。

    Game&Watch 的處理器是 STM32H7B0VBT6,280Mhz Cortex-M7 核心,內部搭載 1376KB 主記憶體與 128KB Flash RAM,外部 Flash 記憶體為 MX25U 系列的 1.8v SPI NOR Flash,薩爾達版本容量為 4MB,瑪利歐版本為 1MB,通過 QSPI 模式與處理器連接。處理器附近有一排 DEBUG 接口,薩爾達版本為 7 孔,瑪利歐版本為 5 孔,排列順序相同(下圖中薩爾達版左 5 孔與瑪利歐版相同)。DEBUG 接口就是這次用來和 ST-LINK 或樹莓派對接的地方,其他詳細的細節可參考這段影片

    與 Game&Watch 連接有兩種方法,依照自身的狀況擇一即可:

    方法(1):使用 ST-LINK 搭配 LINUX 的電腦(樹莓派搭載 Raspbian OS 32bit 也可視為 LINUX 電腦)。ST-LINK 有很多種版本形式,本文使用的是下圖的 ST-LiNK V2 版,接法如下(連接前務必先斷開鋰電池):

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    2024.10.08 補充:上面斷開電源的動畫時動作務必小心放輕,否則焊在 PCB 上的電源母座很可能一併脫落。本人在近日弄掉了一次,最後使用熱風槍+低溫錫把母座成功黏回去。

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    方法(2):使用樹莓派 GPIO,接法如下(連接前務必先斷開鋰電池):

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    兩種我都試過了,我個人建議使用 ST-LINK 搭配安裝 Ubuntu 22.04 64-bit 的電腦,會少走一些冤枉路。用個人電腦編譯 Game&Watch 韌體的速度比樹莓派還快上許多,用 ST-LINK 刷寫韌體的速度也比樹莓派 GPIO 明顯快上不少,可節省超過一半的時間,ST-LINK 刷寫時也有燈號可判斷,比樹莓派 GPIO 刷寫時更直觀,以及在「製作雙系統」時,樹莓派會特別遇到套件版本不相容的問題須額外處理。

    注意:千萬不可以將 ST-LINK 或樹莓派上 VDD 端連接到 Game&Watch 主板 VDD 端,因為 ST-LINK 或樹莓派的 VDD 輸出是 3.3V 或 5V,會燒毀 Flash 記憶體晶片( Flash 晶片只支援 1.65~2 V)。

    另外,連接的時候可不需焊上,只用膠帶固定住即可,方便完工後拆除,不過得注意接觸不良的問題。連接實作如下圖:

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    ST-LINK 的品質似乎也有差。從淘寶順便買回來的 ST-LINK V2 竟然不能用,只好再買一個

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    連接好之後,接下來就是 Linux 電腦(或安裝 Raspbian 32-bit OS 的樹莓派)的事了。以下的 Linux 指令中,藍底白字的部分,請自行依情況不同而逕行修改。如何修改可參考 #白底藍字 的相關說明。

    上述前置作業完成之後,接下來就是進行 Linux  指令操作的部分了。要提醒的是,隨著時間推進,以下內文中某些指令很可能會發生錯誤,例如在某個時間點本來是可以、指令是沒問題的,後來過了一段時間之後,重來一次就突然不行了,這也是許多使用者對 Linux 望而卻步的地方:「明明別人可以,為何我就不行!?」這類問題的原因,多半是某些套件版本或程式碼內容發生變化,而導致的語法不相容錯誤,我會盡可能找出修正指令的方法,並補上黃底紅字說明。

    2、安裝 OpenOCD 與 ToolChain 工具,gnwmanager 管理套件、環境參數設置

    Game&Watch 的處理器採用 STM32 開源方案,OpenOCD(Open On-Chip Debugger)則是開源晶片的調試軟體,可直接視為刷寫韌體的工具軟體。

    先安裝相依套件:

    sudo apt update && sudo apt upgrade -y
    sudo apt install binutils-arm-none-eabi python3 libftdi1 -y
    sudo apt install python3-pip python3-pil git cmake -y

    2.1 安裝 OpenOCD

    操作原理是下載 OpenOCD 的原始碼進行編譯安裝,大約需要幾分鐘到十幾分鐘。指令如下:

    cd ~
    git clone https://github.com/kbeckmann/ubuntu-openocd-git-builder
    cd ~/ubuntu-openocd-git-builder/
    git checkout c1003f4
    git submodule update –init –recursive
    ./build.sh
    sudo dpkg -i openocd-git_*_*.deb
    sudo apt -y -f install
    export OPENOCD=”/opt/openocd-git/bin/openocd”

    執行完畢之後 /opt 底下會生成 openocd-git 目錄,重點是會產生一個執行檔 /opt/openocd-git/bin/openocd。如果沒有這個檔案,表示失敗了。

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    以後要開始進行寫錄韌體前,可以先執行一次 export OPENOCD=”/opt/openocd-git/bin/openocd” 

    2025.02.03 補充:有網友反應這個辦法已經行不通了,剛剛試了一下的確如此,編譯 openocd 會出現 jimtcl 找不到的錯誤。
    既然如此,也可以用 gnwmanager 來安裝 openocd。依本文操作到 2.4 安裝完 gnwmanager 之後,執行以下指令安裝 openocd 即可:

    gnwmanager install openocd

    2.2 下載並安裝設定 ToolChain

    ToolChain 工具鏈是用來編譯 STM32 韌體的工具軟體。Ubuntu 64-bit 電腦和樹莓派 Raspbian OS 32-bit 使用的工具鏈不同。下載安裝 ToolChain 的操作方法如下:

    # ToolChain 平台:linux-x64 – Ubuntu 64bit, linux-arm – 樹莓派 Raspbian OS 32bit
    export arch=linux-x64

    # GCC 版本
    export gccver=10.3.1-2.3

    cd ~
    wget https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v${gccver}/xpack-arm-none-eabi-gcc-${gccver}-${arch}.tar.gz
    mkdir -p ~/gnw
    cd ~/gnw
    tar xvf ../xpack-arm-none-eabi-gcc-${gccver}-${arch}.tar.gz xpack-arm-none-eabi-gcc-${gccver}

    2.3 將 ToolChain 加入路徑中

    # GCC 版本
    export gccver=10.3.1-2.3
    export PATH=$PATH:/home/${USER}/gnw/xpack-arm-none-eabi-gcc-${gccver}/bin/

    想要驗證 ToolChain 有沒有加入 PATH 路徑時,除了 echo $PATH 查看搜尋路徑,還可以輸入 arm-none-eabi- 之後按 TAB 鍵,會列出可執行的指令集。重點是要有底下紅框內的 gcc 和 gdb,因為它是編譯 STM32 自製韌體的必要工具。

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    2.4 安裝 gnwmanager

    gnwmanager 是近期橫空出世的 Game & Watch 整合製作工具,能自動偵測各種狀態(如 G&W 機型、連線方式與上述 openocd 和 toolchain 工具等)與內建管理操作指令。部份 G&W 套件已陸續改用 gnwmanager 進行操作,為避免後續操作卡關,所以還是把它安裝起來。

    sudo apt update
    sudo apt install python3-pip python3-venv
    pip3 install pipx
    export PATH=$PATH:$HOME/.local/bin  # 這行加入 ~/.bashrc 或其他等效文件
    pipx install gnwmanager

    2.5 將環境參數寫入 ~/.bashrc 檔案

    所有的操作指令都在終端機模式下進行,期間會使用到的環境參數例如 OpenOCD、ToolChain 的執行位置、刷機的對象機型(Mario 款或是 Zelda 款)、刷機的方法(使用樹梅派 rpi 或 ST-LINK …),這些參數若能在開啟終端機的當下就能自動設定完成,就不用每次執行時去檢查設定。對於 Debian 系列的 Linux 系統來說(如 Debian、Ubuntu、Mint、Raspberry Pi OS…),只需把環境參數寫入 ~/.bashrc 即可。

    .bashrc 是一個標準的文字檔,可以用任何一種文字編輯器來修改。檔案位於家目錄「~/」,用「.」開頭表示它是一個隱藏檔,一般的情況下看不到它的存在。以下是使用 nano 開啟 ~/.bashrc 的操作指令:

    cd ~
    nano .bashrc

    將以下的環境參數內容,新增到 .bashrc 最下方:

    # 連接方式:rpi – 樹莓派 , stlink – ST-LINK 
    export ADAPTER=stlink

    # Game&Watch 機型 : mario – 瑪利歐款, zelda – 薩爾達款
    export gnw_tg=zelda

    # 設定 OPENOCD 路徑
    export OPENOCD=”/opt/openocd-git/bin/openocd”

    # gnwmanager 的執行路徑
    export PATH=$PATH:$HOME/.local/bin

    # 將 ToolChain 加入 $PATH 路徑 
    export gccver=10.3.1-2.3
    export PATH=/home/${USER}/gnw/xpack-arm-none-eabi-gcc-${gccver}/bin/:$PATH

    接著按下 Ctrl + X,詢問是否存檔時回答 Y 再按 Enter 即可。

    最後,關閉所有的終端機視窗。以後每此啟用終端機視窗時,上述環境參數會自動生效,例如終端機內輸入 echo $PATH 指令看看 ToolChain 有沒有在路徑中,輸入 arm-none-eabi- 之後按 TAB 鍵會不會跑出一堆 arm-none-eabi- 開頭的指令集等等。

    3.備份、解鎖、還原 Game&Watch 韌體

    提醒:每一台 「Game&Watch 35 週年款」掌機,若想要在日後自行寫錄韌體,或是換擴容晶片等,都必須先經歷一次「備份、解鎖、還原」一輪操作。重點在解鎖和備份,出廠之後必須至少做過一次,也只需做過一次即可。

    先確認步驟 1. 的連接是否妥當。Game&Watch 插入 Type-C 電源,開機停在時鐘畫面。並開啟終端機,執行指令如下:

    cd ~
    mkdir -p ~/gnw
    cd ~/gnw
    git clone https://github.com/ghidraninja/game-and-watch-backup.git
    cd ~/gnw/game-and-watch-backup

    # 1_檢查 OpenOCD
    ./1_sanity_check.sh ${ADAPTER} ${gnw_tg}
    # 若 OpenOCD 設定正常,會回應 Running sanity checks…Looks good!

    # 2_備份第1階段
    ./2_backup_flash.sh ${ADAPTER} ${gnw_tg}

    # 英文會提示先把 Game&Watch 切換到時鐘畫面,確定後按 Enter

    完成之後,~/gnw/game-and-watch-backup/backups 目錄底下會產生 flash_backup_zelda.bin 與 itcm_backup_zelda.bin 兩個檔案,Game&Watch 的畫面全黑。繼續以下的動作:

    # 3_備份第2階段
    ./3_backup_internal_flash.sh ${ADAPTER} ${gnw_tg}

    這個步驟比較容易出錯。若是正常進行,中間會出現「Flash successfully programmed. Now do the following procedure:  – Disconnect power from the device …」提示,要把 Game&Watch 斷電重開(斷開 Type-C 再接上,然後按電源鍵),此時 Game&Watch 的畫面是整片藍色,按 Enter 繼續。這個步驟完成之後, backups 目錄下會產生 internal_flash_backup_zelda.bin 檔案。

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    倘若失敗的話,Game&Watch 把 Type-C 斷電重開後會回到時鐘畫面。接著按住 Game&Watch 的電源鍵不放,再執行一次,若進入刷寫程序的話,約 5 秒就能放開電源鍵。總之要看到上面的「Flash successfully programmed. Now do…」的提示訊息、power-cycle 斷電重開後螢幕藍色才算正常。接著繼續:

    # 4_解鎖裝置
    ./4_unlock_device.sh ${ADAPTER} ${gnw_tg}

    完成後會出現「Congratulations, your device has been unlocked. Please power-cycle it for the changes to take full effect.」。通常不會有什麼問題。每一台 Game&Watch 只需做一次解鎖即可。跟著提示做一次 power-cycle (斷開 Type-C 電源再接上,按下 Gamw&Watch 電源鈕),繼續最後一個還原動作:

    # 5_還原成原始韌體內容
    ./5_restore.sh ${ADAPTER} ${gnw_tg}

    完成之後會提示「Success, your device should be running the original firmware again! (You should power-cycle the device now)」,提示把裝置再一次 power-cycle(斷電再開機)。開機之後會回到原廠韌體的時鐘畫面。

    做到這裡,整個步驟 3 就完成了, 如同「開光典禮」般,這台 Game&Watch 經過解鎖步驟的「成年禮」之後,以後便可直接刷寫其他韌體,不需再解鎖。

    指令 #1~#5 備份、解鎖、還原的整個流程正常畫面如下:

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    在 ~/gnw/game-and-watch-backup/backups 目錄底下一共會產生三個檔案:

    • flash_backup_zelda.bin
    • internal_flash_backup_zelda.bin
    • itcm_backup_zelda.bin

    請務必妥善保存這三個檔案。以後這台 Game&Watch 掌機,不論先前刷寫了哪些內容,只需執行指令「#5_還原成原始韌體內容」就能恢復原廠韌體。

    補充說明:
    1. 擴容至 64MB 者,「#5_還原成原始韌體內容」 指令不支援,會報錯。
    2. stlink 的用戶若遇到「Error: libusb_open() failed with LIBUSB_ERROR_ACCESS」的問題(記錄在 logs 中),可執行以下指令後重開機試試看:

    sudo usermod -a -G plugdev `whoami`

    3. 每一台 Game&Watch 掌機,在出廠之後只需做過一次成功解鎖即可。

    4. 編譯安裝自製韌體(retro-go 客製化模擬器)

    目前網路上的中文教學大多是採用 olderzeus 的版本,不過在撰寫本文的時候,發現另一個作者 sylverb 的版本更完善。sylverb 的版本從 olderzeus fork 出來,已包含 olderzeus 的 NewUI 分支(支援多語系和顯示遊戲封面),支援更多的模擬器(包含 SEGA MD),並支援超頻(PC-E 與 MD 遊戲適用)。所以本文以安裝 sylverb 的版本為準。

    提醒:sylverb 版的程式碼更動頻繁,某些版本可能會導致編譯失敗,所以下面 4.1 步驟操作指令中,有特別 checkout 切換至可編譯運作的版本。(2023.02.14 補充)另外,作者 sylverb 似乎於近日完成了任天堂模擬器 fceumm 的移植,終於可以玩任天堂磁碟機(FDS)的遊戲了。

    4.1 下載 sylverb 版 retro-go 原始碼並設置編譯環境

    操作指令如下:

    cd ~
    mkdir -p ~/gnw
    cd ~/gnw
    git clone https://github.com/sylverb/game-and-watch-retro-go.git
    cd ~/gnw/game-and-watch-retro-go
    git checkout 70b8f1a
    git submodule update –init –recursive
    make clean
    chmod a+x scripts/*.sh
    python3 -m pip install -r requirements.txt

    4.2 整理 ROM 檔

    Game&Watch 並不能外接記憶卡等裝置,遊戲的部分必須和韌體一併打包。整理遊戲 ROM 檔沒有特定做法,可依個人的習慣,選擇適合的方式進行。在 ~/gnw/game-and-watch-retro-go/roms 目錄底下有 a7800、…gb、gc…nes…pce 等遊戲主機平台的子目錄,將想玩的遊戲放入不同的子目錄中,最終會和韌體一併編譯封裝。遊戲如果是 .zip 檔,必須解壓縮,遊戲副檔名和遊戲子目錄名稱保持相同。另外 sylverb 的版本是從 olderzeus 的版本 fork 出來的,也支援顯示遊戲封面和中文遊戲名稱。在相同的遊戲目錄下放入遊戲封面縮圖(.jpg 或 .png 或 .bmp),封面圖的主檔名必須和遊戲主檔名一致,不要使用中文檔名。如果有任天堂紅白機的磁碟機遊戲(副檔名為 .fds),一樣放在 nes 目錄下(副檔名依樣維持 .fds 即可),遊戲封面圖檔和遊戲檔名一致,磁碟機系統必備的 BIOS 檔案(disksys.rom)放在 nes_bios\ 目錄下即可。若該遊戲有作弊碼(.ggcode),主檔名也和遊戲檔名一致。以紅白機 ROM 為例,整理如下圖:

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    遊戲 rom、縮圖、作弊碼(如果有的話)都就定位放置好之後,執行以下指令產生遊戲設定檔:

    cd ~/gnw/game-and-watch-retro-go

    make romdef ROMINFOCODE=UTF-8

    執行完後,在 cd ~/gnw/game-and-watch-retro-go 目錄底下會有一系列 xx.json 檔案,例如 gb.json、nes.json、md.json… 等等。

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    可以用文書編輯器開啟,自行編輯修改每個遊戲的中文名稱。

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    小技巧:如果不擅於在 Linux 作業系統環境中編輯文字檔,可以將 json 檔以自己知道的方式(如 ssh,vnc,上傳雲端同步…等等)傳到電腦上進行編輯。編輯完記得要再一次確認以 UTF-8 格式存檔,否則中文會出問題。遊戲封面的製作亦然,以熟用的電腦製作完成後,再傳回 Linux 電腦的 ~/gnw/game-and-watch-retro-go/roms/[模擬器] 目錄下。

    .json 檔中的參數說明:

    • enable_save:該遊戲是否支援自動存檔?1:是 0:否。適用於 make 參數 STATE_SAVING=0 時個別指定遊戲才會生效。
    • publish:該遊戲是否要打包入韌體檔?1:是 0:否。倘若整理出來的遊戲太多,導致編譯韌體大於 Flash 容量而編譯失敗,可利用此設定調整遊戲數量。
    • _cover_height 與 _cover_width :封面的長寬。_cover_width 介於 64 ~ 180,_cover_height 介於 64 ~ 136 。每個 .json 檔案內只有一組,意即每一種遊戲主機平台只有一組封面長寬設定。例如 pce 的遊戲封面多為近正方形,md 的遊戲多為直立矩形,那麼 pce.json 與 md.json 內的 _cover_height 與 _cover_width 的值就可以不相同。

    (2024.01.14 新增)最新的 retro-go 版本新增支援兩款特定的超任遊戲「超級瑪利歐世界」與「薩爾達傳說 – 眾神的三角力」。不過整理遊戲的方式與其他復古遊戲有些不同,方法在文章最下方「補充項目」中說明。

    整理好 ROM 檔之後,下一步動作就是編譯 Game&Watch 的 retro-go 包含遊戲的自製韌體。

    提醒:如果都沒有 ROM 檔,下一步的編譯韌體動作就會出現錯誤「No roms found! Please add …..」。

    4.3 編譯並上傳 retro-go 自製韌體到 Game&Watch

    cd ~/gnw/game-and-watch-retro-go
    # 清除前次的編譯結果
    make clean
    # 下面這行中,拿掉 flash 表示只編譯韌體,不進入刷寫程序。
    make GCC_PATH=/home/${USER}/gnw/xpack-arm-none-eabi-gcc-${gccver}/bin/ COVERFLOW=1 CHEAT_CODES=1 COMPRESS=lzma CODEPAGE=950 EXTFLASH_SIZE_MB=4 OVERCLOCKING_LEVEL=2 GNW_TARGET=${gnw_tg} -j8 flash

    make 編譯參數說明:

    • flash: 韌體編譯完成後繼續進行刷寫。如果參數中沒有 flash 則只是編譯韌體,可用來檢查編譯韌體的過程中有沒有其他問題,免得出錯時誤會是晶片壞了燒不進去。
    • COVERFLOW:是否包含遊戲封面?1:是 0:否
    • CODEPAGE:950 為顯示中文
    • EXTFLASH_SIZE_MB:Flash 容量,瑪利歐款為 1(MB),薩爾達款為 4(MB)。若有更換 Flash 晶片擴容,則必須填入擴容後的數字。如果韌體容量大於該數字的話(例如遊戲放太多)則編譯會失敗。
    • OVERCLOCKING_LEVEL:超頻?0:預設不超頻 1:微超頻 2:最大超頻。經測試,薩爾達原廠 4MB 可以最大超頻,但是自行擴容不一定能最大超頻(會當機停住),受限於晶片體質,得試過才知道。另外,PC-E 與 SEGA MD 的某些遊戲則需要超頻,才能跑得更順。
    • EXTFLASH_FORCE_SPI=1:禁用 quad 模式。禁用之後,retro-go 的「調試選項 – 存儲晶片」會顯示 Unknow。原廠未改裝過的 Flash 晶片不用加上這個參數,如果改裝的擴容晶片運行時脈較低(例如下面提到的 16MB / 32MB 擴容晶片),且啟用超頻的話,可以嘗試加入這個參數試試。如果使用的是下面提到的 64MB Flash (MX25U51245GZ4I00)晶片,則更不能加上此參數,否則在刷寫韌體的過程中(第 15 處)會發生錯誤。
    • CHEAT_CODES=1:作弊碼。可以到這裡這裡找,或是到這裡用遊戲英文名搜尋。任天堂的作弊碼支援 Game Genie 格式(長度為 8 的字串)與基本格式(格式為 xxxx:xx),與遊戲相同主檔名,放在同一目錄即可。(此參數在 2022.12.2 的 7968d42 版以前為 GAME_GENIE=1)。
    • FORCE_NOFRENDO=1:(2023.02.14 新增)強迫使用 nofrendo 核心,而不使用 fceumm 核心。nofrendo 和 fceumm 都是任天堂紅白機的模擬器核心,主要差別在於 fceumm 對 CPU 的使用負載比 nofrendo 高很多(所以建議超頻),但 fceumm 能玩的紅白機遊戲更多,還能玩磁碟機(.fds)遊戲。沒有此參數時,預設使用 fceumm 核心。
    • DISABLE_SPLASH_SCREEN=1:(2023.03.23 新增)關閉 retr-go 啟動圖片。參數 =0 或是沒有此參數時為啟用啟動圖片。關閉時可縮短 retro-go 的啟動時間。

    提示:倘若刷寫出現錯誤,先拿掉 make 的 flash 參數看看編譯韌體的動作有沒有問題。如果加入 flash 指令後出現 openocd …. 之類的錯誤,先檢查連接是否正常,並拔除 Game&Watch 的 Type-C 電源之後再接上,按下 Game&Watch 電源鈕開機後再試。若一直失敗,則除了檢查接觸不良的情況,也可以嘗試接上 Type-C 電源之後按下 Game&Watch 電源鈕不放,接著執行 make 指令。

    進入刷寫動作時, Game&Watch 螢幕會顯示進度和狀態如下(此時 Game&Watch 電源鈕如果是按住時,可以放手了):

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    刷寫完成若一切順利,retro-go 的部分就完成了。最後移除連接線,鋰電池接上,鎖上外殼,一台客製化的 Game&Watch 就此誕生。以薩爾達款 4MB 來說,差不多能放 20 多個紅白機遊戲。PC-E 或 MD 的遊戲就比較佔空間,例如 MD 知名神作「怒之鐵拳」全系列 1~3 代三款遊戲加起來就超過 4MB,「快打旋風 II Turbo」容量就高達 3MB,想玩 PCE 或 MD 遊戲的話 4MB 一定不夠用,這時候就可以考慮擴充升級內置記憶體的容量了。

    5. 擴充 Game&Watch 內置記憶體容量

    原廠 Game&Watch 內置 Flash 記憶體,瑪利歐款使用的是 MX25U8035FM2I,容量只有 8Mb(1MB),薩爾達款好一點,使用 MX25U3232FM2I02,容量 32Mb(4MB),兩者都是 8-SOP 封裝,電壓 1.65V ~ 2V,頻率 133MHz。如果覺得改成 retro-go 之後遊戲實在不夠玩,可自行更換 Flash 晶片擴容,放入更多遊戲。網路上的資訊通常提到的幾款可用型號:

    • MX25U12835FM2I-10G:容量為 128Mb(16MB),和原廠 Flash 晶片一樣的 8-SOP 封裝,電壓 1.65V ~ 2V,頻率 104Mhz。
    • MX25U25635FZ4I-10G:容量為 256Mb(32MB),8-WSON (8×6) 封裝,電壓 1.65V ~ 2V,頻率 108Mhz。
    • MX25U51245GZ4I00:容量為 512Mb(64MB),8-WSON (8×6) 封裝,電壓 1.65V ~ 2V,頻率 166Mhz。

    以上 3 款 Flash 晶片在淘寶或是蝦皮上都有人販售。照理說可用的 Flash 晶片應該不只這兩款(可查看 gw_flash.c#L335 內容),也有 128MB 和 256MB 的 Flash,不過那又是另一種封裝(需使用轉換板),建議小心購買,比較不會踩到地雷。

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    本人的焊工水準平平,所以更換晶片的方式就不多說了,Youtube 搜尋「Game&Watch upgrade flash 」就能搜出好幾個。以下是心得:

    • 該台 Game&Watch 入手之後必須先做過一次解鎖(即本文的步驟 3. 中 #1~#5 全部動作),才能更換晶片。
    • 第一次拆解原廠 Flash 晶片時,建議使用焊槍施工。若要用風槍吹下,建議先用焊槍把原腳位上的錫點,用較低溫的銲錫換過一遍比較保險。例如我個人第一次拆解時並沒有用低溫錫換過原銲錫,直接用風槍吹時,溫度得開到近 400 度才能勉強把原廠晶片吹下來,這種高溫度萬一稍有不慎,就可能把附近的小元件一併溶解吹跑,或是吹壞 Flash 晶片。
    • 由於封裝方式不同,換上 8-WSON (8×6) 建議使用熱風槍施工。個人經驗建議 8-WSON 使用低溫錫施工,風槍溫度約 230 度即可。
    • 建議把主板從外殼上拆下來後再施工。主板以 10 顆十字螺絲固定。特別注意還有兩條排線,各自有黑色小板固定,小心別扯斷。細節可看下圖。

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    • 下圖是薩爾達款的檢查點,可用來檢查焊接是否虛焊不實。

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    Flash 晶片更換完成之後,Game&Watch 在此時是完全無法開機的狀態。可接著進行以下第 6 步驟「安裝雙系統」,或是回到上面第 4 步驟安裝 Retro-Go 模擬器,記得在第 4.3 步驟中 make 參數  EXTFLASH_SIZE_MB 要填入擴容後的數字。

    注意:經實測擴容至 64MB 之後,無法進行上面第 3 步驟第 5 個動作「# 5_還原成原始韌體內容」,會出現無法刷寫的錯誤。更換成 64MB 後,直接進行第 6 步驟即可。

    6. 安裝雙系統

    所謂雙系統,就是在已經 Flash 擴容的 Game&Watch 上,同時安裝原廠韌體和自製韌體,操作原理差不多是把原廠韌體刷寫在前面的 1MB 或 4MB 區塊,自製韌體刷寫在後面剩餘的區塊。不過若是直接把兩種韌體刷上去,就沒有辦法兩者互相切換。所以有人研究出 Patched 原廠韌體加入切換的指令(也就是刷入前 1MB 或 4MB 的原廠韌體是 Patched 過的),達到理想的雙系統的效果。這個項目建議使用 ST-LINK + 個人電腦版的 Linux 64 位元作業系統,因為使用樹莓派會遇到額外的問題需處理

    操作指令如下:

    sudo apt update && sudo apt upgrade -y
    sudo apt install git python3-pip cmake -y
    cd ~
    mkdir -p ~/gnw
    cd ~/gnw
    git clone https://github.com/BrianPugh/game-and-watch-patch
    cd ~/gnw/game-and-watch-patch
    pip3 install -r requirements.txt

    樹莓派 Rasbian OS 32bit 的用戶會出現安裝 keystone-engine 的錯誤(其他 Linux 用戶應該不受影響),需手動下載原始碼並進行編譯與安裝。解決方式如下:

    # =========樹莓派編譯安裝 keystone-engine========

    cd ~
    wget https://files.pythonhosted.org/packages/0a/65/3a2e7e55cc1db188869bbbacee60036828330e0ce57fc5f05a3167ab4b4d/keystone-engine-0.9.2.tar.gz
    tar -zxvf keystone-engine-0.9.2.tar.gz

    接著編輯 ~/gnw/keystone-engine-0.9.2/setup.py,第 114 行

    obj_dir = os.path.join(BUILD_DIR, ‘llvm’, ‘lib’)

    修改成

    obj_dir = os.path.join(BUILD_DIR, ‘llvm’, ‘lib’, ‘arm-linux-gnueabihf’)

    存檔離開,然後編譯安裝 keystone-engine。以下兩種方法擇一即可。

    方法一:

    cd ~/keystone-engine-0.9.2
    python3 -m pip install .

    (補充:「python3 -m pip install . 」後面可加上 –verbose –log logfilename.txt 查看安裝訊息)

    方法二:

    cd ~
    tar czvf keystone-engine-0.9.2mod.tar.gz keystone-engine-0.9.2
    pip3 install keystone-engine-0.9.2mod.tar.gz

    不論是哪個方法,編譯安裝都需要一段長時間。應該就不會有錯誤訊息了。如果是樹莓派 3(1GB)的用戶,編譯安裝時又可能會遇到記憶體容量不足的問題,得加大 swapfile 交換檔設定,方法如下:

    以 sudo 權限編輯 /etc/dphys-swapfile,找到 CONF_SWAPSIZE=… 這行,把數字改成 1024(或是大於 1024 的任一數字),存檔離開。繼續以下指令:

    # 重新啟用 swapfile:
    sudo service dphys-swapfile restart

    #檢查設定
    swapon -s

    加大 swapfile 生效之後,再做一次編譯安裝(上述兩方法擇一)

    # ======= END OF 樹莓派編譯安裝 keystone-engine ====

    做完上述的動作之後(樹莓派用戶解決 keystone-engine 的安裝問題,其他 Linux 用戶應該不受影響),繼續執行以下指令:

    cd ~/gnw/game-and-watch-patch
    make download_sdk

    做完之後,再將第 3 步驟產生的原始備份 flash_backup_zelda.bin、internal_flash_backup_zelda.bin 與 itcm_backup_zelda.bin 三個檔案複製一份,放在 game-and-watch-patch 的根目錄下。

    接著開始燒錄第一個區塊:原廠 Patch 韌體

    # 提示: 擴容 >= 64MB 時,make 參數一定要加上 LARGE_FLASH=1 ,否則會出現 Flash sector_erase failed on sector 0 的錯誤。

    # make PATCH_PARAMS=”–device=zelda” LARGE_FLASH=1 flash_patched

    cd ~/gnw/game-and-watch-patch
    make clean
    make PATCH_PARAMS=”–device=${gnw_tg}” flash_patched

    make 參數說明如下:

    • LARGE_FLASH=1:如果擴容後的容量 >= 64MB,則必須加上這個參數,否則會出現 Flash sector_erase failed on sector 0 的錯誤而中止。
    • flash_patched:加上此參數則會刷寫 Patch 過的韌體,若不加此參數,則只會進行 Patch 韌體動作而不會進行刷寫,不加參數可用來檢查第 3 步驟取得的原廠備份韌體是否有無問題。另外,若將此參數改成 flash_stock 則是直接刷寫原廠備份韌體,作用相當於第 3 步驟的指令#5,配合 LARGE_FLASH=1 參數可將原廠韌體刷入 >=64MB 的 Flash,不過未經 Patched 的原廠韌體刷入擴容 64MB 並無任何意義,因為無法使用擴容空間。

    執行畫面如下:

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    如果整個過程中沒看到上圖類似綠字的部分,表示先前的步驟有問題,可能與第 3 步驟取得的原廠韌體檔案不符有關,得回去逐一檢查看看。

    如果都沒問題的話,完成之後,Game&Watch 會恢復成原廠環境,power cycle 之後會出現時鐘畫面 。

    接著燒錄第二個區塊 retro-go 客製化韌體

    cd ~/gnw/game-and-watch-retro-go
    make clean

    # 編譯第二區塊的指令,為步驟 4.3 的 make 參數中, EXTFLASH_SIZE_MB 值要扣除原廠韌體的容量,再加上兩個參數 EXTFLASH_OFFSET=[偏移量] INTFLASH_BANK=2 。其他的參數都和步驟 4.3 相同。
    # 例如擴容至 16MB 的 zelda 款來說,參數為 EXTFLASH_SIZE_MB=12 EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2,完整 make 指令如下:

    make GCC_PATH=/home/${USER}/gnw/xpack-arm-none-eabi-gcc-${gccver}/bin/ COVERFLOW=1 CHEAT_CODES=1 COMPRESS=lzma CODEPAGE=950 EXTFLASH_SIZE_MB=12 GNW_TARGET=${gnw_tg} EXTFLASH_FORCE_SPI=1 EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2 OVERCLOCKING_LEVEL=2 -j8 flash

    和 4.3 步驟相同道理,CHEAT_CODES、CODEPAGE、EXTFLASH_FORCE_SPI 等參數可參考 4.3 的說明,make 指令不加 flash 的話只會編譯而不刷機,可用來檢視編譯過程中有無問題,沒問題時再加入 flash 進行刷機。另外再補充一點,如果有超頻(OVERCLOCKING_LEVEL=2),那麼有改裝擴容為 16MB 與 32MB 的用戶,由於該晶片的預設工作頻率較低,最好再加上 EXTFLASH_FORCE_SPI=1 參數,否則遊戲很可能會開不起來或是各種閃退。(一旦啟用 EXTFLASH_FORCE_SPI=1 ,retro-go 的「調試選項 – 存儲晶片」會顯示 Unknow,不影響使用)

    開始刷機時通常會出現一行錯誤紅字「Flashing chunk 0 failed… power cycle unit and retry? (y/n)」,要求 power-cycle 一次(斷開 Game&Watch 的 Type-C 電源再接上,按電源鍵開啟),做完回到電腦按 y 繼續,正常的話就會開始刷寫第二區塊韌體。若再不行的話則多按 y 幾次(原廠時鐘畫面),或是再檢查一下有無接觸不良的情況。又或者可以按住 Game&Watch 本體的電源鍵不放的情況下,電腦按 y 繼續。有時要試個 4、5 次才會繼續。

    刷寫所需的時間除了與韌體大小有關,也和使用 ST-LINK 或樹梅派刷寫有關,我個人的經驗是約 52MB 韌體使用 ST-LINK 刷寫大約是 12 分鐘就結束,網路上有人分享用樹梅派刷寫近 60MB 耗時約 50 分鐘。

    做完就大功告成了。在原廠韌體畫面(即薩爾達時鐘畫面)同時按住「方向鍵左+GAME 鍵」就會進入客製韌體,按電源鍵重開機回到原廠韌體。

    如果想在「Game&Watch 35 週年款」遊玩上個世紀的 Game&Watch 老遊戲的話,請繼續閱讀「轉換為 retro-go 可用的 Game&Watch 復古遊戲」。

    心得後記

    不少復古遊戲玩家都認為 Game&Watch 的螢幕與按鈕太小,遊戲體驗一定不好,Game&Watch 35 週年款的收藏意義大於實用價值。不過我個人體驗之後卻不這麼覺得。透過解鎖、擴容、刷寫支援更多平台的 sylverb 版自製韌體與雙系統之後,這台掌機成為了出門必備良品。體積夠小,可以隨意放在身上任何一處口袋,收取相當便利,秒開機,關機即時存檔,支援遊戲即時狀態存取,隨時隨地拿出來接續遊戲進度毫無懸念,而且非常省電。它支援遊戲的 0.5/0.75 慢速運行(MD 遊戲目前不支援慢速),玩起射擊遊戲這類即時反應的遊戲難度大幅降低。搭載的螢幕雖然不大,但是螢幕解析度 320×240 對於紅白機、PC-E、MD 這類低解析度的老主機已是綽綽有餘,螢幕發色也很不錯。最近幾天利用生活的碎片時間,一些昔日想玩卻沒玩到、當時怎麼玩都破不了關的遊戲,經由 CHEAT_CODES=1 的作弊神功加持,全都逐一在這台掌機上破關補完了,對我來說它已是實用性遠大於收藏。

    不過它也是有一些缺點,例如十字鍵偏小容易誤按,A 鍵太靠近本體邊緣不好連打,喇叭聲音太小(國外有改裝耳機埠的教學),retro-go 支援的遊戲也有限(不是所有的 nes/pce/md… 都能玩,有些  PC-E 或 MD 的遊戲甚至還會固定閃退)。不過對於一台僅以 788 元入手,以及花點小錢擴容的機器來說,CP 值仍是很值得。截至撰寫本文時,摸摸電商的 888 元特價活動仍在,PCHome 上也有在販售 Wame&Watch 薩爾達款,兩台合購也只要 1,680(平均一台不到 850元),建議愛好復古遊戲者、並且對自己焊工手藝有信心和 DIY 感興趣的人,可以趁便宜時買來搞搞玩玩看。

    補充:轉換為 retro-go 可用的 Game&Watch 復古遊戲

    上個世紀的 Game&Watch 也可以用模擬器來運行。不過和一般的遊戲 ROM 很不同的是,最原始的 Game & Watch 的 ROM 檔並未包含(也不可能包含)圖像資料,所以模擬 Game&Watch 的遊戲還得額外載入特別製作的圖像素材(另稱「裝飾檔」)才能正常遊玩。以 Retropie 這個模擬器來說,直接載入別人已整合完成的 .gnw 檔案即可,MAME 的話就必須同時具備遊戲 ROM 的 .zip 與素材的 .zip (檔名與副檔名都相同的兩個檔案)才能正常遊玩。

    至於 retro-go 採用的 Game&Watch ROM 檔,則必須使用 MAME 的格式,透過 bzhxx/LCD-Game-Shrinker 這個工具轉換成 .gw 之後,再放到  retro-go 的 roms/gw 目錄底下,轉換工具必須在 Linux 的環境下操作(建議使用 Ubuntu 22.04,樹莓派建議最新版 Raspbian GNU/Linux 11 bullseye )。詳細的操作方式可以參考 DNA64/LCD-Game-Shrinker-Guide.md 這篇文章。做法如下:

    # 套件更新
    sudo apt update && sudo apt upgrade -y
    # 安裝 git (如已安裝可省略)
    sudo apt install git python3-pip -y

    # 下載與安裝 LCD-Game-Shrinker 工具

    cd ~
    git clone https://github.com/bzhxx/LCD-Game-Shrinker
    cd ~/LCD-Game-Shrinker
    python3 -m pip install -r requirements.txt

    接著安裝 Inkscape ,它是知名的編修向量素材的軟體。

    sudo apt install inkscape -y

    繼續將 MAME 格式的 Game&Watch 遊戲檔案(有兩個,遊戲 ROM .zip素材 .zip,檔名和副檔名都一樣的兩個檔案),分別放到以下兩個目錄中

    •  ~/LCD-Game-Shrinker/input/rom:遊戲 ROM .zip
    • ~/LCD-Game-Shrinker/input/artwork:遊戲素材 .zip

    (2023.02.15 補充)由於 sylverb 在最新版的 game-and-watch-retro-go/LCD-Game-Emulator 模擬器中移除對 .lz4 壓縮格式的支援,改成只支援 .lzma 格式(因為 .lzma 壓縮後體積更小,可在有限的容量中放入更多 G&W 遊戲),所以要手動修改 LCD-Game-Shrinker 轉檔程式。使用任何一種文書編輯器(nano 或 gedit)開啟 ~/LCD-Game-Shrinker/shrink_it.py ,找到下圖中紅框的兩行(第 55,56 行):

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    把這兩行前面的 # 對調:

    #COMPRESS_WITH = LZ4_COMPRESSOR
    COMPRESS_WITH = LZMA_COMPRESSOR

    將 shrink_it.py 存檔。最後執行 LCD-Game-Shrinker:

    cd ~/LCD-Game-Shrinker
    python3 shrink_it.py

    執行過程如下:

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    如果遊戲夠多的話(根據 WIKI 資料大約是近 60 款遊戲),全部轉完也要幾分鐘的時間。若一切順利的話,在 ~/LCD-Game-Shrinker/output 目錄下會生成 .gw 檔案,這些就是 retro-go 可用的 Game&Watch 遊戲 ROM 檔。附帶一提的是,~/LCD-Game-Shrinker/preview 目錄下是遊戲預覽圖,可用來製作遊戲封面。

    不過,若是出現「returned non-zero exit status 1.」錯誤(發生於 Inkscape 0.92 版)或「FileNotFoundError: [Errno 2] No such file or directory」錯誤(發生於 Inkscape >= 1.2 版)的話,則可能是 apt 預設下載的 Inkscape 版本與 LCD-Game-Shrinker 不相容。經測試與 LCD-Game-Shrinker 相容的 Inkscape 版本是 1.0 與 1.1。有兩種方式:

    方法一:apt 查詢可安裝的版本

    apt policy inkscape

    查詢結果如下:

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    如果出現的是 1.0 或 1.1 版,安裝時只要輸入完整的版本號碼(上圖黃框處)即可。指令如下:

    sudo apt install inkscape=1.1.1-3ubuntu1~bpo20.04.1 -y
    # 執行 LCD-Game-Shrinker
    cd ~/LCD-Game-Shrinker
    python3 shrink_it.py

    方法二:如果方法一沒有出現 1.0 或 1.1 版時,就只能用這個方法了。將版本資訊加入 apt 安裝源,完整指令如下:

    sudo add-apt-repository ppa:inkscape.dev/stable-1.1
    sudo apt update
    sudo apt install inkscape
    # 執行 LCD-Game-Shrinker
    cd ~/LCD-Game-Shrinker
    python3 shrink_it.py

    當然了,復古 Game&Watch 遊戲也可自製封面,一併放到  ~/gnw/game-and-watch-retro-go/roms/gw 底下,再透過步驟 4.3 編譯上傳。

    【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

    額外項目:有限運行超任特定遊戲

    如果各位的 Game & Watch 35 周年款已經黑工程成功,暢玩紅白機、PC-E、Sega MD 等第三世代第四世代的遊戲,那麼可能跟我有一樣的疑問:這台機器能不能執行同樣是第四世代的超級任天堂(SFC)遊戲呢?不久前在 Github 上發現兩個專案,分別是 marian-m12l/game-and-watch-smw 與 marian-m12l/game-and-watch-zelda3,顧名思義,是在 Game & Watch 35 週年款運行超任遊戲「超級瑪利歐世界」(美版 Super Mario World)和「薩爾達傳說:眾神的三角神力」(美版 Legend of Zelda, The – A Link to the Past ) 。不過嚴格來說它並不是一般認知的模擬器方案,而是 Rom Patched 的手段,讓遊戲移植到其他平台上運作。

    我找時間依照說明試了一下,超級瑪利歐世界會出現記憶體刷寫錯誤而失敗,不過超任版薩爾達是真的可以運行,音樂和音效也都有,幀率穩定 30fps ,實在是太神奇了。可惜的是超任的按鈕比 Game & Watch 多出好幾顆,遊戲玩起來實在很憋扭。編譯刷寫的方法和 game-and-watch-retro-go 非常類似,不同的地方在於 ToolChain 的 GCC 版本必須使用 12 版以上(12.3.1-1.2),編譯時把文章中的 gccver=10.3.1-2.3 改成 gccver=12.3.1-1.2 就差不多了,有興趣的人可以試試看。

    補充項目:有限運行超任遊戲「超級瑪利歐世界」與「薩爾達傳說:眾神的三角神力」

    最新版的 retro-go 韌體新增支援超任的特定兩款遊戲:「超級瑪利歐世界」(美版 Super Mario World)和「薩爾達傳說:眾神的三角神力」(美版 Legend of Zelda, The – A Link to the Past )。由於這兩款遊戲是以反向工程的手段(拆解遊戲 ROM 檔 Patched)來實現移植至其他平台運行,因此兩款遊戲有各自的執行程式,並非常見的模擬器讀取 ROM 檔運作。目前 retro-go 客製韌體支援的超任遊戲也只有這兩款,整理 ROM 的方式也和其他復古遊戲有些不同。

    作法如下:

    1.由於是 Patched ROM 檔,所以遊戲的 ROM 檔版本有嚴格限制。

    • 「超級瑪利歐世界」必須是美版的 ROM,SHA-1 值為 6B47BB75D16514B6A476AA0C73A683A2A4C18765 ,MD5 值為 CDD3C8C37322978CA8669B34BC89C804。
    • 「薩爾達傳說:眾神的三角神力」美版 ROM 的 SHA-1 值為 6D4F10A8B10E10DBE624CB23CF03B88BB8252973,MD5 值為 608C22B8FF930C62DC2DE54BCD6EBA72。

    2.「超級瑪利歐世界」的 ROM 檔名限定為 smw.sfc,放置於 retro-go 的 game-and-watch-retro-go\roms\smw 目錄下。「薩爾達傳說:眾神的三角神力」的 ROM 檔名限定 zelda3.sfc,放置在 game-and-watch-retro-go\roms\zelda3 目錄下。意即一目錄僅一個遊戲。

    3.make romdef ROMINFOCODE=UTF-8 指令並不會產生這兩款遊戲的 json 文件,所以需要自行製作 smw.json 與 zelda3.json 文件。或是修改 retro-go 的 parse_romdef.py 原始檔,再交由 make romdef 產生 json 文件檔案。

    4.可自行製作遊戲封面,邏輯與其他遊戲相同,即 smw.jpg 與 smw.sfc 同目錄,zelda3.jpg 與 zelda3.sfc 同目錄。封面大小可在 json 文件內自行定義(_cover_height 與 _cover_width)。

    5.「薩爾達傳說:眾神的三角神力」也支援其他語系的 ROM 檔。各語系的 ROM 檔 SHA-1 可參考 util.py 原始碼

    雖然 Game & Watch 35 周年款可成功運行這兩款超任遊戲,不過 Game & Watch 按鈕數量和配置與超任有些差異,這兩款遊戲玩起來感覺不太舒服,所以個人認為象徵意義大於實用體驗。希望有朝一日能移植 Gradius III 這類較少按鈕即可暢玩的超任遊戲,似乎就更完美了。

    教程參考資料:

    資源:

    62 Comments

    1. 這篇好清楚完整!感謝分享
      我完全門外漢,想和您請教
      在# 2_備份第1階段
      ./2_backup_flash.sh ${ADAPTER} ${gnw_tg}
      我使用ST-link刷機
      跑一下會出現:
      Attempting to dump flash using adapter stink.
      Running Openocd… (This can take up to a few minutes.)
      「Fatled to dump SPi flash from device. Vertfy debug connection and try agatn.」
      請問有可能是什麼原因呢?
      我要重複數十次前後操作一直重來都無解,想和您請教,非常感謝🥹
      版主回覆:(12/11/2022 11:53:54 AM)
      要看一下 LOG 內容才會知道。LOG 檔位於 game-and-watch-backup/logs 底下,應該會有一個叫 2_backup_flash.log 的檔案

    2. 謝謝板主回應!
      只有找到[2_openocd.log]
      請問我該重複哪個操作呢?有可能是接觸不良或是stlink有問題嗎?謝謝您
      版主回覆:(12/11/2022 04:59:26 PM)
      用筆記本看裡面的內容寫什麼,才會知道發生什麼事。您說的都有可能

    3. make GCC_PATH=/home/${USER}/gnw/xpack-arm-none-eabi-gcc-10.3.1-2.3/bin/ COVERFLOW=1 CHEAT_CODES=1 COMPRESS=lzma CODEPAGE=936 EXTFLASH_SIZE_MB=60 GNW_TARGET=zelda EXTFLASH_FORCE_SPI=1 EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2 OVERCLOCKING_LEVEL=2 -j8 flash
      Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dac.c:1:1: error: unterminated comment
      1 | /**
      | ^
      make[1]: *** [Makefile.common:605:build/core/stm32h7xx_hal_dac.o] 错误 1
      make[1]: *** 正在等待未完成的任务….
      Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.c:390:1: error: unterminated comment
      390 | /**
      | ^
      Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.c:63: error: unterminated #ifdef
      63 | #ifdef HAL_DMA_MODULE_ENABLED
      |
      Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.c:74:13: warning: ‘DMA_MultiBufferSetConfig’ used but never defined
      74 | static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);
      | ^~~~~~~~~~~~~~~~~~~~~~~~
      make[1]: *** [Makefile.common:605:build/core/stm32h7xx_hal_dma_ex.o] 错误 1
      make[1]: 离开目录“/home/zbabla/gnw/game-and-watch-retro-go”
      make: *** [Makefile.common:750:flash] 错误 2
      不知道怎么弄了。
      版主回覆:(03/25/2023 11:43:23 PM)
      感覺上像是某個動作沒有確實運作完成,導致後來 gcc 編譯出錯。建議檢查 gcc 的路徑
      ,以及 retro-go 的下載/安裝/編譯等操作重新再來一次。

    4. 已跟程序做成功解鎖, 並出現以下訊息
      Congratulations, your device has been unlocked. Just a few more steps!
      – The Game & Watch will not yet be functional
      – Disconnect power from the device for the changes to take full effect
      – Power it again
      – Run the 5_restore.sh script to restore the SPI and Internal Flash.
      但當我按指示斷開電源後, 卻未能重新開機, 即使長按電源鍵都沒有反應, 現在可以怎麼辦? 我有看到已產生那3個backup的檔案
      版主回覆:(03/25/2023 11:36:44 PM)
      看起來是剛做完第 4 步驟的解瑣,這時候 power-cycle 不能啟動是正常的。直接進行 5_restore.sh 即可。

    5. 按照楼主的方法已经做好了zelda版本的双系统,请教一下几个问题:1. 在教程4.1中“git checkout 118bf92”的意思是什么?是选择仓库中的某一历史版本吗?主要是后面我使用教程提到的“DISABLE_SPLASH_SCREEN=1:(2023.03.23 新增)關閉 retr-go 啟動圖片。參數 =0 或是沒有此參數時為啟用啟動圖片。關閉時可縮短 retro-go 的啟動時間。”参数好像没有效果,=1后,每次进入go还是有动画图片。2.楼主教程最上面的那个图片也是自己修改的吗?3.是否能针对双系统出一份存档备份和导出的教程,我试了很多次,都没有搞明白,非常感谢。
      版主回覆:(03/31/2023 03:30:06 PM)
      1. 是的,118bf92 是今年 3/21 的版本,支援 make 的新參數 DISABLE_SPLASH_SCREEN=1,我已經實測過,的確是把 LOGO 輪播的動畫關閉了,稍稍加快了 retro-go 的載入速度。之所以會把版號放入教學步驟的原因,是因為曾經在某個時期內,持續發生當時最新版出現編譯語法錯誤,導致無法編譯完成的問題。
      2. 文章最上方第一張主圖,是用繪圖軟體合成的,素材來自網路,單純只是文章配圖的裝飾用途,而非 G&W 機器上真的能展示彩色復古主機圖。
      3. 先前嘗試過,存檔備份和導出貌似與遊戲中文化衝突,所以我就沒寫這部分教程了。改天若成功的話,會再來更新補上這部分的教學。

    6. “DISABLE_SPLASH_SCREEN=1,我已經實測過,的確是把 LOGO 輪播的動畫關閉了”这个是从原系统启动到自制系统时候,显现出来的很多机种快速切换的那个动画吗?我设置了=1,但是启动自制系统时候还是有这个画面,很奇怪了。
      版主回覆:(04/01/2023 08:55:34 AM)
      看一下這網址,並檢查相關的檔案,有沒有 DISABLE_SPLASH_SCREEN 這個參數
      https://github.com/sylverb/game-and-watch-retro-go/commit/118bf929d4a3cf9228d2fb349a5c3c5d5d3c0a53

    7. 说起来奇怪,我在文件中也确实找到了DISABLE_SPLASH_SCREEN==0这一段了,我还特意试了DISABLE_SPLASH_SCREEN=1和DISABLE_SPLASH_SCREEN=0,结果切换到go的时候完全没有区别~还是很感谢了,这篇教程是我见过中最全面的了。现在最大的问题就是存档的备份和还原了,昨天测试的时候,加了一个游戏进去,好家伙,几天的存档白打了~!
      版主回覆:(04/05/2023 10:31:11 AM)
      當韌體的遊戲內容出現變化時,遊戲的相關設定包含存檔就可能出現遺失、重置的情況。

    8. olderzeus在github回复:“存档是可以导出,但需要机器上刷机版本的elf那些个文件。
      由于使用了中文名称,导出的文件名和导入的识别会出现异常,需要你自行查阅相关脚本进行调整。
      scripts/saves_restore.sh 和 saves_backup.sh 文件脚本.”不知道老哥是否有相关的一些思路,谢谢
      版主回覆:(04/05/2023 11:04:52 AM)
      目前的研究心得分享如下….
      1. retro-go 的韌體,須先把程式、遊戲/存檔/縮圖/作弊碼…等相關檔案編譯合併為 .elf 格式的文件檔案,經由 openocd 刷寫入 G&W 的 FlashRom 內韌體。而 elf 文件檔案就會包含每個遊戲的 rom 檔、縮圖、存檔紀錄、作弊碼….的 Flash 位址。
      2. 遊戲存檔的匯出,saves_backup.sh 會先讀取 .elf 文件的資訊,取得遊戲的存檔 Flash 位址之後,經由 openocd 指定位址讀取的方式,連線到 G&W 設備擷取該 Flash 位址內的遊戲存檔內容。因此必須保證刷寫電腦上的 .elf 文件就是當初刷入 G&W 的那一個,這樣位址才會正確對應。
      3. 遊戲中文化導致遊戲存檔失敗的原因,是因為 openocd 在取得遊戲存檔之後,試圖以中文名稱儲存在本機的系統而導致衝突錯誤,並產生長度 0 的亂碼文件名稱。
      4. 若想要恢復遊戲存檔的匯出匯入,可以嘗試不要將遊戲名稱中文化,也就是 nes.json, pce.json, md.json…. 文件內容中不要使用中文。我試過「不中文化」的遊戲存檔匯出匯入是可行的。
      5. 雙系統的遊戲存檔匯出匯入,匯出時一樣要加入 EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2 … 等和位址有關的編譯指令(最好是 make 下了哪些指令,saves_backup.sh 也要跟著有),否則會抓到錯誤的內容。

    9. 对了,关于启动画面的命令,我使用的是:“make GCC_PATH=/home/${USER}/gnw/xpack-arm-none-eabi-gcc-10.3.1-2.3/bin/ COVERFLOW=1 COMPRESS=lzma CODEPAGE=936 EXTFLASH_SIZE_MB=60 GNW_TARGET=${gnw_tg} EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2 -j8 DISABLE_SPLASH_SCREEN=1 flash”,换的64MB的Flash
      版主回覆:(04/05/2023 11:10:55 AM)
      我的刷寫指令除了 CODEPAGE=950 其他都與您的全數相同(目前也升級至 64MB),為何 DISABLE_SPLASH_SCREEN 沒有作用我就無法理解了。其實停用 LOGO 輪播動畫,載入retro-go 速度,感覺上也不到一秒的差異。

    10. 請問燒錄fds進遊戲都是灰畫面,有放bios
      版主回覆:(04/05/2023 11:20:11 AM)
      在最早在 beta 版的時候我也遇到相同的問題,執行 fds 遊戲出現灰畫面,後來檢查後才發現作者當時提供 bios 的檔名資訊是錯的(當時寫 disksystem.rom 是錯的,現在作者已經改回來了)。
      fds 遊戲詳細的作法如下,請逐一檢查看看:
      — 遊戲副檔名 .fds,放到 roms\nes\ 目錄下
      — BIOS 檔名 disksys.rom,放到 roms\nes_bios\ 目錄下
      — disksys.rom 大小 8,192 byte, md5 值 ca30b50f880eb660a320674ed365ef7a

    11. 我一个群友也在玩这个GW刷机,他想整合一下LCD的老GW游戏,但是一直报错,您看是否知道是什么原因呢
      gnw_zelda |——————–| 0/1 UnzipTraceback (most recent call last):
      File "/usr/lib/python3.8/urllib/request.py", line 1354, in do_open
      h.request(req.get_method(), req.selector, req.data, headers,
      File "/usr/lib/python3.8/http/client.py", line 1256, in request
      self._send_request(method, url, body, headers, encode_chunked)
      File "/usr/lib/python3.8/http/client.py", line 1302, in _send_request
      self.endheaders(body, encode_chunked=encode_chunked)
      File "/usr/lib/python3.8/http/client.py", line 1251, in endheaders
      self._send_output(message_body, encode_chunked=encode_chunked)
      File "/usr/lib/python3.8/http/client.py", line 1011, in _send_output
      self.send(msg)
      File "/usr/lib/python3.8/http/client.py", line 951, in send
      self.connect()
      File "/usr/lib/python3.8/http/client.py", line 1418, in connect
      super().connect()
      File "/usr/lib/python3.8/http/client.py", line 922, in connect
      self.sock = self._create_connection(
      File "/usr/lib/python3.8/socket.py", line 808, in create_connection
      raise err
      File "/usr/lib/python3.8/socket.py", line 796, in create_connection
      sock.connect(sa)
      ConnectionRefusedError: [Errno 111] Connection refused
      版主回覆:(04/11/2023 02:22:38 PM)
      ConnectionRefusedError 是網路出現錯誤,很可能是 Python 指令中某些需要下載套件的時候,發生無法下載的錯誤,在某個環節被拒絕了。據說中國大部分地區使用 Github 似乎不太順暢,若您的群友是居住在中國大陸,可能就是那個原因了。

    12. 我朋友把路由弄了一下可以访问就可以下载PY了,目前测试没有问题了。非常感谢!
      我这边还想问一下:现在我使用的是64M Flash,正在使用双系统。如果我不想要原来的系统了,我可以换成单系统吗?就是在启动时候直接进入retro-go。等过了一段时间想继续用双系统的时候,还可以刷回双系统?这两个步骤是如何工作的?
      版主回覆:(04/19/2023 10:34:54 AM)
      64MB 可以直接刷單系統,刷寫 retro-go 的 make 指令中,修改 EXTFLASH_SIZE_MB 的數字為 64,並拿掉 EXTFLASH_OFFSET=4194304 這一串就行了,開機會直接進入 retro-go。(EXTFLASH_OFFSET=4194304 的意思是從 4MB 以後的 Flash 位址開始刷寫)
      若要再改回雙系統,一樣也是步驟 6 的操作,各自把原廠 Patched 韌體和 retro-go 的韌體刷入(刷入 retro-go 時記得要把 EXTFLASH_OFFSET=4194304 放回去)。

    13. 你好,請問一下,在作雙系統時(已換32M),它會出現the adapter doesn’t support configuratble speed
      版主回覆:(04/21/2023 09:48:47 AM)
      我本人沒遇過這種情況,上網查了一下好像不是錯誤訊息,而是提示訊息,理論上可以不管它。

    14. 如果有同学usb的stlink不能用的话,试着升级一下stlink的固件
      如果备份原始固件的时候说检测不到的话,试着按住电源键插电,再执行脚本,据说是某些廉价usb不支持复位功能…
      版主回覆:(05/03/2023 09:39:07 AM)
      感謝補充!

    15. 请问为什么export PATH=$PATH:/home/${USER}/gnw/xpack-arm-none-eabi-gcc-10.3.1-2.3/bin/ 这条指令键入后,在执行make flash 命令时依旧提示请使用GCC10.0或以上版本呢
      版主回覆:(06/02/2023 12:26:32 PM)
      抱歉不是很清楚問題在哪….試試看 export 把路徑順序改一下能否解決
      export PATH=/home/${USER}/gnw/xpack-arm-none-eabi-gcc-10.3.1-2.3/bin/:$PATH

    16. 老哥啊,最近这个系统有没有更新啊,特别是存档的导入和导出部分,前阵子好像还看到有人做了GB的带时钟系统的模拟器,但是找不到呢。。,
      版主回覆:(07/14/2023 12:05:22 AM)
      這個專案有一段時間沒有關注了,retro-go 作者最近也少有更新(本來說好的新版 GB 模擬器從五月起也沒有下文),詳情不太清楚了,抱歉啊!

    17. 大神您好,我现在就是这种情况。
      注意:經實測擴容至 64MB 之後,無法進行上面第 3 步驟第 5 個動作「# 5_還原成原始內容」,會出現無法刷寫的錯誤。
      应该怎么操作呢?直接刷双系统?
      版主回覆:(07/14/2023 06:48:11 PM)
      您好!是的,擴容至 64MB 之後,直接刷雙系統,或是刷第三方韌體(retro-go)就行了。
      第 3 步驟是解鎖流程,適用於購入後尚未擴容、計畫改機之前必須做的動作。除了解鎖G&W之外,並取得原始的出廠韌體檔案。並且「# 5_還原成原始內容」這個動作並不支援擴容至 64MB,會報錯。
      如果真的想把出廠韌體寫入 64MB 擴容也是可以,必須使用「6. 安裝雙系統」中 make PATCH_PARAMS="–device=zelda" LARGE_FLASH=1 flash_stock 這個指令(flash_patched 是刷寫修改過的出場韌體,flash_stock 是刷入未修改過的出廠韌體)。不過這麼做一點意義都沒有,因為開機之後是原廠韌體運行,無法利用後方擴容的空間。

    18. 編譯第二區塊的指令,為步驟 4.3 的 make 參數中, EXTFLASH_SIZE_MB 值要扣除原廠韌體的容量,再加上兩個參數 EXTFLASH_OFFSET=[偏移量] INTFLASH_BANK=2 。其他的參數都和步驟 4.3 相同。….
      不知道後來是否有改版,但我測試的結果不一樣;如果把容量設成60,再偏移4194304,那只剩下56MB 可以使用. 要設成64MB(實際容量) 才會成為60MB可以用.
      版主回覆:(07/21/2023 10:33:48 AM)
      BrianPugh/game-and-watch-patch 的 Github 範例內的確是這麼寫的(如下),我個人沒去注意是否出現變化。
      # In this example, I’m assuming you have a 64MB flash chip (60 = 64 – 4)
      make -j8 EXTFLASH_SIZE_MB=60 EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2 flash

    19. 继续请教一下,我使用./scripts/saves_backup.shbuild/gw_retro_go.elf
      ./scripts/saves_backup.sh和./scripts/saves_backup.shbuild/gw_retro_go.elfGCC_PATH=/home/S{u
      SER}/gnw/xpack-arm-none-eabi-qcc-10.3.1-2.3/bin/都会提示:“
      • /scripts/saves backup.sh:行 26: arm-none-eabi-adb:未找到命令”这个是什么原因呢?谢谢
      版主回覆:(07/31/2023 04:40:51 PM)
      錯誤指的是操作環境中沒有 "arm-none-eabi-adb" 這個程序。這個程序照道理應該在本文步驟 2 下載的 ToolChain 裡面,並且我查了一下 saves_backup.sh 源碼,它的指令應該是 arm-none-eabi-gdb 。本文步驟 2 下載的 ToolChain 裡面有 "arm-none-eabi-gdb" 並沒有 "arm-none-eabi-adb",所以要請您自行核對是哪裡出了問題。

    20. 弱弱的問一下,請問ROM目錄下的遊戲是要自己搜尋下載嗎?謝謝!
      版主回覆:(09/20/2023 03:45:37 PM)
      當然啊~畢竟遊戲那麼多,要全部放進任何一台遊戲機是不可能的,所以多半是挑選自己喜歡的遊戲。 rom 還有版權問題,得自己想辦法去取得。不過取得 Rom 也不難,通常只要把遊戲名稱加關鍵字 rom download 拿去 Google 就有了。

    21. 我以為我能一路通行結果還是遇到問題了,請教大神,我在6.安裝雙系統執行 make PATCH_PARAMS="–device=${gnw_tg}" LARGE_FLASH=1 flash_patched後執行結果如下:
      Binary Patching Complete!
      Internal Firmware Used: 121320 bytes
      Free: 9752 bytes
      Compressed Memory Used: 0 bytes
      Free: 0 bytes
      External Firmware Used: 4194304 bytes
      /opt/openocd-git/bin/openocd -f openocd/interface_"rpi".cfg \
      -c "init; halt;" \
      -c "program build/internal_flash_patched.bin 0x08000000 "";" \
      -c "reset; exit;"
      Open On-Chip Debugger 0.12.0+dev-00314-g51d4996c5-dirty (2023-09-16-21:27)
      Licensed under GNU GPL v2
      For bug reports, read
      http://openocd.org/doc/doxygen/bugs.html
      DEPRECATED! use ‘sysfsgpio swd_nums’ not ‘sysfsgpio_swd_nums’
      DEPRECATED! use ‘sysfsgpio srst_num’ not ‘sysfsgpio_srst_num’
      none separate
      Info : SysfsGPIO JTAG/SWD bitbang driver
      Info : Note: The adapter "sysfsgpio" doesn’t support configurable speed
      Error: Error connecting DP: cannot read IDR
      make: *** [Makefile:274:flash_patched_int] 錯誤 1
      請大神幫忙看看是哪裡錯了,感謝您!
      版主回覆:(09/22/2023 11:49:40 PM)
      Patched 韌體的部分看起來完成了,是後來 openocd 這個部分出錯了,連接設備出現錯誤。
      可能是沒連接好,或 ST-LINK 驅動的設定錯了,或是其他可能。
      https://www.cnblogs.com/zhouxingxing7920/p/17462521.html

    22. 执行make COVERFLOW=1 CHEAT_CODES=1 COMPRESS=lzma CODEPAGE=936 EXTFLASH_SIZE_MB=4 OVERCLOCKING_LEVEL=2 GNW_TARGET=zelda后报如下错误,请指教,谢谢!
      Entering ‘retro-go-stm32’
      [ BASH ] Checking for updated roms
      [ CC core ] main.c
      Core/Src/main.c: In function ‘MX_OCTOSPI1_Init’:
      Core/Src/main.c:968:15: error: ‘OSPI_InitTypeDef’ has no member named ‘ClkChipSelectHighTime’; did you mean ‘ChipSelectHighTime’?
      968 | hospi1.Init.ClkChipSelectHighTime = 0;
      | ^~~~~~~~~~~~~~~~~~~~~
      | ChipSelectHighTime
      make: *** [Makefile.common:652: build/core/main.o] Error 1
      版主回覆:(10/12/2023 03:13:35 PM)
      看起來像是 gcc 錯誤….「2.2 下載並安裝設定 ToolChain」的步驟有確實嗎? 輸入 arm-none-eabi- 之後按 Tab 鍵,有跑出 arm-none-eabi-gdb 與相關項目嗎?

    23. 感谢贴主的详细教程,已经从中构建环境,并且成功刷机,但是在打包gw的约54款游戏的时候却提示楼上一样的网络错误,折腾很多天了 还是不能成功,不知道贴主是否愿意分享一下gw 成功转档的文件,再次感谢贴主分享
      版主回覆:(10/19/2023 07:01:33 PM)
      更新:lzma 格式,幾天後失效,解壓密碼game&watch
      http://u.pc.cd/GzhrtalK

    24. urllib.error.URLError: <urlopen error [Errno 111] Connection refused>
      gnw_lboat |——————–| 0/1 UnzipTraceback (most recent call last):
      File "/usr/lib/python3.8/urllib/request.py", line 1354, in do_open
      h.request(req.get_method(), req.selector, req.data, headers,
      File "/usr/lib/python3.8/http/client.py", line 1256, in request
      self._send_request(method, url, body, headers, encode_chunked)
      File "/usr/lib/python3.8/http/client.py", line 1302, in _send_request
      self.endheaders(body, encode_chunked=encode_chunked)
      File "/usr/lib/python3.8/http/client.py", line 1251, in endheaders
      self._send_output(message_body, encode_chunked=encode_chunked)
      File "/usr/lib/python3.8/http/client.py", line 1011, in _send_output
      self.send(msg)
      File "/usr/lib/python3.8/http/client.py", line 951, in send
      self.connect()
      File "/usr/lib/python3.8/http/client.py", line 1418, in connect
      super().connect()
      File "/usr/lib/python3.8/http/client.py", line 922, in connect
      self.sock = self._create_connection(
      File "/usr/lib/python3.8/socket.py", line 808, in create_connection
      raise err
      File "/usr/lib/python3.8/socket.py", line 796, in create_connection
      sock.connect(sa)
      ConnectionRefusedError: [Errno 111] Connection refused
      During handling of the above exception, another exception occurred:
      Traceback (most recent call last):
      File "shrink_it.py", line 153, in <module>
      rom_parser.set_parameters(rom_name, rom.mame_rom_dir)
      File "/home/zhiming362/LCD-Game-Shrinker/rom_parser.py", line 197, in set_parameters
      urllib.request.urlretrieve(url_tested, mame_driver_file)
      File "/usr/lib/python3.8/urllib/request.py", line 247, in urlretrieve
      with contextlib.closing(urlopen(url, data)) as fp:
      File "/usr/lib/python3.8/urllib/request.py", line 222, in urlopen
      return opener.open(url, data, timeout)
      File "/usr/lib/python3.8/urllib/request.py", line 525, in open
      response = self._open(req, data)
      File "/usr/lib/python3.8/urllib/request.py", line 542, in _open
      result = self._call_chain(self.handle_open, protocol, protocol +
      File "/usr/lib/python3.8/urllib/request.py", line 502, in _call_chain
      result = func(*args)
      File "/usr/lib/python3.8/urllib/request.py", line 1397, in https_open
      return self.do_open(http.client.HTTPSConnection, req,
      File "/usr/lib/python3.8/urllib/request.py", line 1357, in do_open
      raise URLError(err)
      urllib.error.URLError: <urlopen error [Errno 111] Connection refused>
      另外贴上报错内容,如果不方便上传rom,贴主能否帮我看看能解决吗
      版主回覆:(10/19/2023 07:01:18 PM)
      抱歉這兩天才注意到有新的留言,網路問題的原因如同上面所說的,至於要怎麼解決我是真的不了解(網路環境不同)。全套 gw 檔案我晚上回家找找。
      更新:lzma 格式,幾天後失效,解壓密碼game&watch
      http://u.pc.cd/GzhrtalK

    25. 感谢贴主的分享,通过分享的文件已经成功刷入机内,至于gw原始的文档按照你的教程指向链接已经下载好游戏和素材,就不必麻烦您上传了,总之非常感谢您的帮助

    26. 又见大佬更新,咨询一下你最后说“5.「薩爾達傳說:眾神的三角神力」也支援其他語系的 ROM 檔。各語系的 ROM 檔 SHA-1 可參考 util.py 原始碼。”这个意思是还能换其他语言的ROM?比如说中文?
      版主回覆:(01/19/2024 12:59:52 PM)
      util.py 裡面的語系並不包括中文版,我的估計是這款遊戲當初官方就有發行不同語系的版本(美、德、法、西班牙…),當初並未發行中文版。現在看到的中文版 ROM 是從美版修改的,並非官方發行的版本。
      我有嘗試把中文版 ROM 偽裝成英文版成功刷入G&W,沒想到在 G&W 上竟然恢復成英文版的 ROM。
      至於「超級瑪利歐世界」也有中文版的 ROM,我將它偽裝成英文版之後則是無法成功刷入,所以這兩款超任遊戲的中文版我還不知道如何讓它在 G&W 上運行。

    27. 对了大佬,我看你最后面,关于刷sfc塞尔的那部分文字有一段被删掉了,是什么原因呀,那段关于软件升级的部分是必须要做的吗?谢谢
      版主回覆:(01/22/2024 04:40:41 PM)
      新版 retro-go 已經把支援 sfc 兩款遊戲的源碼整併進來,所以標示刪除的那一段文字是過時資訊,當成留個紀錄罷了。
      在刪除的內容中提到必須升級 gcc 至 12 版,是因為刪除內容中的做法,gcc 10 (舊)版會造成編譯錯誤而失敗。
      而新版 retro-go 將 sfc 遊戲源碼整併進來之後,似乎有一併做過修正,gcc 10 (舊)版、12版、最新13版全都能編譯成功,所以就沒提到必須升級 gcc 了。

    28. 原来如此,那我的retro-go是不是更新一下也就可以了呢?能方便说一下更新命令吗?谢谢
      版主回覆:(01/23/2024 11:00:21 AM)
      更新的指令應該是這樣
      cd ~/gnw/game-and-watch-retro-go
      git pull
      git submodule update –init –recursive
      不過,因為我會手動修改某些 retro-go 源代碼內容,可能導致 git pull 失敗,
      所以我的習慣是把 roms 目錄備份之後,重新操作一次步驟 4.1 ,再把備份的 roms 覆蓋回去。

    29. 更新的指令應該是這樣
      cd ~/gnw/game-and-watch-retro-go
      git pull
      git submodule update –init –recursive
      请教一下,我试了一下这个命令,前两天都是正常的,第二条提示有很多分支,看不太懂,第三条命令执行后没有反应,不知道是什么原因呢?
      版主回覆:(02/19/2024 05:41:12 PM)
      第二條指令在遠端源碼發生新的變動時,就會顯示訊息。第三條指令是一併更相依的子套件,如果子套件沒有更新,則不會有任何訊息產生。
      我審視了一下自己寫的指令,由於下了 check out xxxxxxx 指令,所以 git pull 有可能會失敗。如果要讓本地端的源碼維持與遠端源碼更新一致時,那麼要在指令拿掉 check out xxxxxxx 這一行

    30. parallels@ubuntu-Linux-22-04-02-desktop:~/gnw/game-and-watch-backup$ -/3_backup_internal_flash.sh ${ADAPTER} ${gn
      w_tg}
      Validating IT™ dump…
      This step will overwrite the contents of the SPI flash chip that we backed up in step 2.
      It will be restored in step 5. Continue? (y/N)
      Generating encrypted flash image from backed up data…
      Programming payload to SPI flash…
      (core dumped) ${OPENOCD} -f "openocd/target
      00000 verify;" -c "exit;" > logs/3_openocd. log 2>81
      Writing payload to SPI flash failed. Check debug connection and try again. parallels@ubuntu-linux-22-04-02-desktop:~/anw/game-and-watch-backups$
      請問備份時,解鎖前第3部份失敗可以怎樣辦,原裝未改記憶的Zelda!
      版主回覆:(03/22/2024 05:32:29 PM)
      文章中提到第三步失敗的話,G&W重開機還是會回到時鐘畫面。如果前兩個步驟有正常產生檔案的話,可以重複進行第三步,直到成功為止。
      從指令看起來,你用的是 Parallels Desktop 的 Linux 模擬機,Host 主機是 macOS 嗎?我之前試過,這個組合無法刷寫 G&W 韌體,它在 ST Link 重導至虛擬機內部時很容易出錯,是改用 VMWare Fusion 才能刷寫成功。而為了保險起見,我在舊的黑蘋果二號機(i7-3770)特別佈署一套 Ubuntu 20.04 專門用來刷寫 G&W ,捨棄虛擬機的刷寫方式。

    31. 對!! 是M2 macOS ARM, 第一及第二步是可以,第三步這個錯誤試了一百次都不成,現在才有空再試,拿一個桌機下載安裝Ubuntu試試看

    32. 例行来老哥网站看看GW有没有更新新内容:)
      版主回覆:(04/29/2024 10:12:22 AM)
      感謝點閱,
      我有注意到 Sylver Bruneau 的 retro-go 專案項目一直都有更新,
      而且變動還不小,連工具都換了,
      我估計可能是加入擴充記憶卡的功能,
      這些變動目前還沒合併到主分支上,
      未來 G&W 新增哪些玩法,現在還不好說,
      但肯定是有的。

    33. 老哥晚上好,和你请教两个问题:1.新出的windows下用的gnwmanager用过吗?有没有机会也出个教程?https://github.com/BrianPugh/gnwmanager ? 2.我去问过作者有没有可能出WS黑白机器的模拟器,作者回复:“I think my porting attempt is stored in a branch of my repository, anyone can take it and finish it by removing color support and finishing sound support. I personally prefer to see a full featured WS/SWC emulator later but I understand people would love to be able to play not color games before it happens”我对github不熟,这种分支能不能直接用?添加到现在的模拟器里面呢?谢谢
      版主回覆:(11/04/2024 10:34:19 AM)
      抱歉您說的問題我都沒有涉獵,所以不能很精確地回答。一般來說 Github 要使用分支的話,就是使用指令 git checkout <分支名稱> ,根據作者的說法是他有製作了支援的分支但並沒有完成,如果要用的話,切換到該分支之後,需要再做一些修改。意思是要懂一些編程技術才能操作,因此不能直接拿來用,也不適合添加(應該說是合併)到當前的模擬器。

    34. 問一下 現在mario款板面選單
      可以變中文嗎?
      好像說只有z款才能中文
      昨天我刷完z款 解鎖&還原成功
      就能直接換記憶體嗎?
      還是要解鎖時換&還是都行?
      只要有解鎖過就都行嗎?
      是用 rpi 400刷的
      版主回覆:(10/07/2024 09:36:10 AM)
      1. Mario 款能改成中文嗎?理論上可以,但我沒有實際試過。NewUI 中文源碼並沒有限定 Zelda 款。
      2. 解鎖還原完成之後,就可以直接關電源拆機換記憶體了。解鎖過就行了,
      換完之後,機器是完全不能開機的,這時候直接刷雙系統或是 retro-go 都可以。

    35. 了解—-謝謝版大回覆
      昨天也解鎖Mario款
      看明天有沒時間換
      64m記憶體了
      roms的轉換好像比較麻煩@@!!!
      看著版大文章還再研究中@@!!!
      版主回覆:(10/11/2024 02:31:18 PM)
      加油,等您好消息

    36. 老哥,最近看有人测试那种TF卡拷贝游戏进去的那种,您这边有了解过吗?谢谢
      版主回覆:(11/04/2024 04:56:37 PM)
      retro-go 作者 sylverb 在 patreon 上有新消息,目前程式專案還在測試中,硬體上也要實施物理性大改動,從原來的 Flash 或是 CPU 拉出引腳接入 TF 卡,這工程看起來太浩大了,我不打算跟進。任天堂似乎不再繼續生產,市售量也越來越少,玩壞一台就少一台,擴容已經是最大極限,64MB 也夠我玩很久,重刷也不麻煩,不太想去折騰 TF 方案。

    37. 确实64M够用很久了,但是换ROM和导存档还是相对来说麻烦一点。老任的这批塞尔达我感觉没停产啊,市面上越来越多,价格越来越便宜,在大陆通过拼多多,不到120就能包邮买到

    38. 正在重建相依關係… 完成
      「正在讀取狀態資料… 完成
      libftdi1-2 已是最新版本(1.5-5build3)。
      libusb-0.1-4 已是最新版本(2:0.1.12-32build3)。
      libusb-0.1-4 被設定為手動安裝。
      pkg-config 已是最新版本(0.29.2-1ubuntu3)。
      pkg-config 被設定為手動安裝。
      libftdi1 已是最新版本(0.20-4ubuntu1)。
      git 已是最新版本(1:2.34.1-1ubuntu1.11)。
      libusb-1.0-0 已是最新版本(2:1.0.25-1ubuntu2)。
      libusb-1.0-0 被設定為手動安裝。


      有些套件無法安裝。這可能意謂著您的要求難以解決,或是若您使用的是 unstable 發行版,可能有些必要的套件尚未建立,或是被移出 Incoming了。
      【以下的資訊或許有助於解決當前的情況:
      下列的套件有未滿足的相依關係:
      dpkg-dev: 相依關係: libdpkg-perl (= 1.21.1ubuntu2.1) 但1.21.1ubuntu2.3 卻將被
      安裝
      推薦: libalgorithm-merge-perl 但它卻將不會被安裝
      libusb-1.0-0-dev: 相依關係: libusb-1.0-0 (= 2:1.0.25-1ubuntu1) 但2:1.0.25-1ub
      untu2 卻將被安裝
      推薦: libusb-1.0-doc 但它卻將不會被安裝
      「大約需要幾分鐘到十幾分鐘。指令如下:
      ocd-git-builder
      42
      E:無法修正問題,您保留(hold)了損毀的套件。
      請問為什麼會這樣?有重裝系統
      版主回覆:(12/11/2024 05:22:38 PM)
      先執行 sudo apt –fix broken install 試試看

    39. 【以下的資訊或許有助於解決當前的情況:
      下列的套件有未滿足的相依關係:
      dpkg-dev: 相依關係: libdpkg-perl (= 1.21.1ubuntu2.1) 但1.21.1ubuntu2.3 卻將被
      安裝
      推薦: libalgorithm-merge-perl 但它卻將不會被安裝
      libusb-1.0-0-dev: 相依關係: libusb-1.0-0 (= 2:1.0.25-1ubuntu1) 但2:1.0.25-1ub
      untu2 卻將被安裝
      推薦: libusb-1.0-doc 但它卻將不會被安裝
      「大約需要幾分鐘到十幾分鐘。指令如下:
      ocd-git-builder
      42
      E:無法修正問題,您保留(hold)了損毀的套件。
      請問為什麼會這樣?有重裝系統
      先執行 sudo apt –fix broken install 試試看
      我試了不行
      版主回覆:(12/13/2024 09:57:51 AM)
      請依照文章所給定的 Linux 版本操作看看。
      我試過 Ubuntu 20, 22, 24 以及 Debian 11/12 都沒甚麼問題。

    40. CC amstrad CPC ] save_amstrad.c
      [CC amstrad CPC ] amstrad_catalog.c
      [ CC amstrad CPC] amstrad_format.c
      [CC amstrad CPC] amstrad_loader.c
      [CC amstrad CPC] amstrad_video8bpp.c
      [LD] gw_retro_go.elf
      External flash usage
      Capacity:
      3964928 Bytes (3.781 MB)
      Usage:
      3158980 Bytes (3.013 MB)
      Free:
      805948 Bytes (0.769 MB)
      [BIN] gw_retro_go_intflash.bin
      /opt/openocd-git/bin/openocd -f scripts/interface_stlink.cfg -c "program build/g
      w_retro_go_intflash.bin 0x08000000 verify reset exit"
      I
      Open On-Chip Debugger 0.12.0+dev-00801-9133dd9d66-dirty (2024-12-13-16:02)
      Licensed under GNU GPL v2
      For bug reports, read
      http://openocd.org/doc/doxygen/bugs.html
      Debug adapter doesn’t support ‘hla_swd’ transport
      make[1]: *** [Makefile.common:932: flash_intflash] 錯誤 1
      make[1]:離開目錄「/home/user/gnw/game-and-watch-retro-go」
      make: *** [Makefile.common:950: flash] 錯誤 2
      user@user-System-Product-Name:~/gnw/game-and-watch-retro-gos這是什麼出錯
      版主回覆:(12/16/2024 08:58:51 AM)
      韌體編譯成功但 openocd 寫入失敗。可能是使用的寫錄設備不支援。

    41. 如果是設備問題?要怎麼處理
      版主回覆:(12/16/2024 04:55:44 PM)
      更換寫錄的設備,例如我的文章內遇到的失敗經驗,最初買到一支不能用的 ST-LINK,各種嘗試刷寫韌體都失敗,也不能確認是故障還是其他原因,然而從另一個來源購買另一款就可以用了。

    42. XPSR: 0x61000000 pc: 0x081012ca
      msp: 0x2001fe50
      Loading image into RAM
      851968 bytes written at address 0x24025800
      downloaded 851968 bytes in 13.778869s (60.382 KiB/s)
      65 bytes written at address 0x20000658
      downloaded 65 bytes in 0.0019525 (32.519 KiB/s)
      Starting flash process
      Please see the LCD for interactive status.
      State: FLASHAPP_CHECK_HASH_RAM
      Hash mismatch in FLASH. Flashing failed.
      Flashing chunk 14 failed… power cycle unit and retry? (y/n)
      y
      SD
      Retry count 2/10
      State: FLASHAPP_ERROR
      State: FLASHAPP_ERROR
      State: FLASHAPP_ERROR
      請問是什麼出問題
      版主回覆:(12/17/2024 01:34:31 AM)
      刷寫失敗,之前我有遇過,印象中有兩個原因:1. 刷 64MB 時使用了 EXTFLASH_FORCE_SPI=1 參數,這個參數必須拿掉。2. Flash 玩壞,換一顆就好了。
      以上是個人經驗,可能有第三種以上的原因。

    43. user@user-System-Product-Name: ~/LCD-Game-Shrinker
      Q
      X

      python3 shrink_it.py
      gnw_mickdon
      —10/1 UnzipTraceback (most recent
      call last):
      Me
      影片線
      File "/home/user/LCD-Game-Shrinker/shrink_it.py", line 153, in <module> rom_parser.set_parameters(rom_name, rom.mame_rom_dir)
      shri
      File "/home/user/LCD-Game-Shrinker/rom_parser.py", line 548, in set_parameters importlib.import_module(module_name)
      -/LCD-G
      File "/usr/lib/python3.10/importlib/_init_.py", line 126, in import_module return _bootstrap._gcd_import (name [level:], package, level)
      pressed with Z
      49
      File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
      File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
      File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
      File "<frozen importlib._bootstrap_external>", line 883, in exec_module
      File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
      File "/home/user/LCD-Game-Shrinker/custom/gnw_mickdon.py", line 97, in <module
      set_single_screen()
      File "/home/user/LCD-Game-Shrinker/custom/dual2single_screen.py", line 144, in set_single_screen
      x, y = rom.background_topleft_xy AttributeError: module ‘rom_config’ has no attribute ‘background_topleft_xy’. Di
      d you mean: ‘background_top_file’?
      請問要轉gw 出現這個錯誤
      版主回覆:(01/02/2025 11:47:44 AM)
      套件的版本不相容而出現語法錯誤。可以查看先前的留言中有我轉好的 gw 版本,不用自己折疼了。

    44. RWData Table
      0x00018390: 0x00000171
      0x00002388
      0x0000029C
      0x2000A800
      0x000183AO:
      0x00000179
      0x0001B3A4:
      0xFFFFFCF9
      Binary Patching Complete!
      Internal Firmware Used: 121320 bytes
      SSD
      Free: 9752 bytes
      Compressed Memory Used: 0 bytes
      Free: 0 bytes
      SSD
      External Firmware Used: 4194304 bytes
      SSD
      gnwmanager flash ext build/external_flash_patched.bin \
      flash bank1 build/internal_flash_patched.bin
      start bank1
      I
      Error communicating with device (Unable to autodetect & connect to debugging probe.). Is it ON and connected?
      user@user-System-Product-Name:~/gnw/game-and-watch-patch$
      請問有5個燒錄工具都燒錄不進去,上星期還可以燒錄,是哪有問題
      版主回覆:(01/06/2025 04:27:16 PM)
      字面上看來是刷寫時溝通出了問題,線索不足,如果之前有成功過,那麼可能是接觸不良之類的情況。先前看過有人分享,杜邦線也有可能挖坑。

    45. 如果是杜邦線要怎麼用才能燒錄
      版主回覆:(01/07/2025 12:01:11 PM)
      更換品質好一點的線材,更極端的做法是悍死

    46. 5個都不能刷,是不是仿的
      版主回覆:(01/09/2025 12:09:56 PM)
      市面上買得到的刷寫工具大多是相容的(原廠的很貴),品質就不一定了,如文中所言我就買到不能用的。
      不過之前有成功過的話,應該是有能用的,要考慮其他因素。
      如果刷寫工具始終不能用的話,可以改考慮樹莓派。樹莓派都是正廠,只需三條杜邦線就能用,不會有工具不相容的問題,不過杜邦線也要注意避坑就是了。

    47. ubuntu所有燒錄設備和杜邦線都試看了還是不行,是環境設備的問題嗎
      版主回覆:(01/18/2025 10:53:39 PM)
      我使用的作業系統版本是文中提到的那些,遇到不能燒錄的問題就是 ST-LINK 、杜邦線、Flash 晶片損毀這三種,如果三個都換過還不能燒錄,我就真的不知道是怎麼回事了,

    48. checking for realpath… yes
      checking whether to build a release… no
      checking whether to build Doxygen as HTML… yes
      checking whether to build Doxygen as PDF… no
      checking whether to enable verbose USB I/O messages… no
      checking whether to enable verbose USB communication messages… no
      checking whether to enable malloc free space logging… no
      checking for jimtcl >= 0.79… no
      checking for jim.h… no
      configure: error: jimtcl is required but not found via pkg-config and system includes
      make[1]: *** [Makefile:5:all] 錯誤 1
      make[1]: 離開目錄「/home/user/ubuntu-openocd-git-builder/openocd-git」
      dh_auto_build: error: make -j2 returned exit code 2
      make: *** [debian/rules:4:build] 錯誤 255
      dpkg-buildpackage: 錯誤: debian/rules build subprocess returned exit status 2
      可以幫忙確認一下為甚麼openocd的安裝到一半都會出錯,現在一直卡在這邊
      版主回覆:(02/03/2025 04:11:06 PM)
      剛剛踹了一下,真的會出錯,本來是好好的。
      看來是不知什麼原因,openocd 改了源碼,現在編譯 openocd 時出錯,說是少了 jimtcl 套件。
      有一種比較簡單的做法是先安裝 gnwmanager ,
      再透過 gnwmanager 安裝 openocd,就不用編譯 openocd 了。
      sudo pip3 install gnwmanager
      sudo gnwmanager install openocd

    49. 卡在openocd 出錯不能安裝,有什麼辦法解決
      版主回覆:(02/03/2025 04:53:02 PM)
      的確如此,編譯源碼安裝的方式壞掉了。剛看了一下,該作者已經把專案封存,看來這個問題已經不會修復了。
      可以改用 gnwmanager 安裝 openocd。做法是:
      sudo pip3 install gnwmanager
      sudo gnwmanager install openocd
      安裝完之後,openocd 的路徑會變成 /usr/bin/openocd
      所以上面提到的 export OPENOCD="/opt/openocd-git/bin/openocd" 拿掉就行了

    50. )
      Requirement already satisfied: rich<14.0.0,>=13.8.1 in /usr/local/lib/python3.10/dist-packages (from gnwmana .9.4)
      Requirement already satisfied: autoregistry<2.0.0,>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from g г) (1.1.2)
      Requirement already satisfied: psutil<6.0.0,>=5.9.6 in /usr/local/lib/python3.10/dist-packages (from gnwmana 9.8)
      Requirement already satisfied: rich-rst<2.0.0,>=1.3.1 in /usr/local/lib/python3.10/dist-packages (from cycla 0,>=2.9.9->gnwmanager) (1.3.1)
      Requirement already satisfied: docstring-parser>=0.15 in /usr/local/lib/python3.10/dist-packages (from cyclo 0,>=2.9.9->gnwmanager) (0.16) US
      Requirement already satisfied: attrs>=23.1.0 in /usr/local/lib/python3.10/dist-packages (from cyclopts<3.0.6 ->gnwmanager) (25.1.0)
      Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich<1 13.8.1->gnwmanager) (3.0.0) Led ко-1t-ру-2
      /pythonsto
      Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.10/dist-packages (from rich >=13.8.1->gnwmanager) (2.19.1)
      Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2 ch<14.0.0,>=13.8.1->gnwmanager) (0.1.2)
      Requirement already satisfied: docutils in /usr/local/lib/python3.10/dist-packages (from rich-rst<2.0.0,>=1.
      lopts<3.0.0,>=2.9.9->gnwmanager) (0.21.2)
      WARNING: Running pip as the ‘root’ user can result in broken permissions and conflicting behaviour with the ackage manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
      安裝完變這樣
      版主回覆:(02/05/2025 10:19:11 AM)
      只是警告,建議你不要用管理權限安裝。沒有錯誤的話可以不理。

    51. 環境參數寫入 ~/.bashrc是不是要移除openocd 路徑 ?
      版主回覆:(02/05/2025 10:15:56 AM)
      gnwmanager 會動搜尋系統中的可用 openocd,透過 gnwmanager 安裝 openocd 的話,export OPENOCD="/opt/openocd-git/bin/openocd" 可以移除,沒移除其實也沒差,gnwmanager 會自己去抓正確的路徑。

    52. eback (most recent call last):
      _e "/home/user/.local/bin/gnwmanager", line 8, in <module>
      sys.exit(run_app())
      Le "/home/user/.local/share/pipx/venvs/gnwmanager/lib/python3.10/site-packag wmanager/cli/main.py", line 261, in run_app
      app.meta()
      Le "/home/user/.local/share/pipx/venvs/gnwmanager/lib/python3.10/site-packag yclopts/core.py", line 903, in _ call_
      return command(*bound.args, **bound.kwargs)
      Le "/home/user/.local/share/pipx/venvs/gnwmanager/lib/python3.10/site-packag
      wmanager/cli/main.py", line 232, in main Command(*bound.args, **bound.kwargs, **additional_kwargs)
      Le "/home/user/.local/share/pipx/venvs/gnwmanager/lib/python3.10/site-packag wmanager/cli/_flash.py", line 38, in flash
      gnw.start_gnwmanager()
      le "/home/user/.local/share/pipx/venvs/gnwmanager/lib/python3.10/site-packag
      nwmanager/gnw.py", line 640, in start_gnwmanager
      self.wait_for_idle()
      le "/home/user/.local/share/pipx/venvs/gnwmanager/lib/python3.10/site-packag nwmanager/gnw.py", line 181, in wait_for_idle raise TimeoutError("wait_for_idle") coutError: wait_for_idle
      請問這是什麼原因,謝謝你&#128591;
      版主回覆:(02/06/2025 11:03:10 AM)
      看起來是等待裝置閒置時發生逾時錯誤,不過我沒遇過這種問題,所以不知道怎麼會這樣,抱歉

    發佈留言

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *