본문 바로가기

Game/Console

[Game & Watch] 롬 교체 - 백업 및 Retro-Go 플래싱 (3/3)

1편 - 디버거 셋팅

2편 - Game & Watch 분해 및디버그 프로브 연결

3편 - 롬 백업 및 Retro-Go 플래싱

 

펌웨어 백업 및 ROM 읽기 보호 해제

펌웨어 및 컨텐츠를 백업하고 외부 데이터를 Write 할 수있도록 ROM 읽기 보호를 해제시켜야 합니다. 

참고: https://github.com/ghidraninja/game-and-watch-backup

 

1. 백업 도구를 라즈베리파이로 가져옵니다.

root@ubuntu:/home/ubuntu# git clone https://github.com/ghidraninja/game-and-watch-backup
root@ubuntu:/home/ubuntu# cd game-and-watch-backup

 

2. 앞서 빌드했던 OPENOCD 경로를 환경변수로 추가합니다.

root@ubuntu:/home/ubuntu/game-and-watch-backup# export OPENOCD="/opt/openocd-git/bin/openocd"

 

3. 순서대로 쉘 파일을 실행만 하면되는데, 각 쉘 파일의 역할은 다음과 같습니다.

1_sanity_check.sh 실행에 필요한 조건이 충족되는지 상태를 체크합니다.
정상이면 OK를 반환합니다.
2_backup_flash.sh SPI Flash 내용을 백업합니다. 
이 단계까지는 콘솔을 사용할 수 있습니다.

실행할 때 디버거 종류를 파라미터로 추가해야 합니다.
ex) ./2_backup_flash.sh rpi 
스크립트 실행 후 기기를 켜서 시계화면이 표시되면 Enter키를 눌러 진행합니다.

3_backup_internal_flash.sh 내장 Flash 내용을 백업합니다.
SPI Flash 에 더미 데이터와 페이로드를 주입시켜서 데이터를 밀어내는 방식으로 백업이 되므로 이 시점부터
 콘솔이 동작하지 않습니다. 당황하지마세요.

실행할 때 디버거 종류를 파라미터로 추가해야 합니다.

ex) ./3_backup_internal_flash.sh rpi 
4_unlock_device.sh 읽기 보호를 해제합니다. 내장 Flash 내용이 지워집니다.

실행할 때 디버거 종류를 파라미터로 추가해야 합니다.
ex) ./4_unlock_device.sh rpi 
5_restore.sh 오리지널 펌웨어로 복원합니다.

1에서 4까지 차례대로 실행합니다. 

 

1_sanity_check.sh

2_backup_flash.sh rpi

이 스크립트가 정상적으로 실행되면 backup 폴더에 flash_backup.bin, itcm_backup.bin 파일이 생성됩니다.

소요시간 약 10~20분

 

3_backup_internal_flash.sh rpi

전원버튼을 누른 상태로 USB-C 전원 케이블을 연결하고 스크립트를 실행합니다.

약 10분 정도 지난 후, 화면에 표시되는 지시를 따릅니다.

- USB-C 전원 케이블 해제

- 다시 USB-C 전원 연결

- 전원 버튼을 누른 채로 Enter

정상적으로 실행이되면 backup 폴더에 internal_flash_backup.bin 파일이 생성됩니다.

 

 

4_unlock_device.sh rpi

락을 해제합니다.

 

1에서 4번까지 정상적으로 수행되면 하위 백업 폴더에 아래와 같이 백업 파일 3개가 생성됩니다.

유실되지 않도록 안전하게 보관해주세요. 


Game & Watch Flashloader 빌드

1. 사용하는 디버거를 환경변수로 지정합니다.

root@ubuntu:/home/ubuntu#export ADAPTER=rpi

 

2. flashloader 를 다운받고 빌드합니다.

root@ubuntu:/home/ubuntu#git clone https://github.com/ghidraninja/game-and-watch-flashloader
root@ubuntu:/home/ubuntu#cd game-and-watch-flashloader
root@ubuntu:/home/ubuntu/game-and-watch-flashloader# make
root@ubuntu:/home/ubuntu/game-and-watch-flashloader# cd ..

빌드에 성공하면 /home/ubuntu/game-and-watch-flashloader/build 디렉토리에 gw_base.elf, gw_base.hex, gw_base.bin 3파일이 생성됩니다.

 


Game & Watch Retro-Go 빌드 및 플래싱

1. 서브모듈을 포함한 소스코드를 다운받습니다.

root@ubuntu:/home/ubuntu#git clone --recurse-submodules https://github.com/kbeckmann/game-and-watch-retro-go
root@ubuntu:/home/ubuntu# cd game-and-watch-retro-go/

 

참고: Zelda 버전으로 플래싱하시는 분들께

과거에 이미 한번 Retro-Go를 받은 경우, 해당 폴더 안에서 git pull --recurse-submodules 를 실행해서 모듈 업데이트를 하고 다시 빌드해주세요. 다양한 기능이 업데이트 되었습니다.

 

2. 콘솔에 넣을 롬 파일을 다운받은 소스코드 내 적절한 위치로 복사합니다.

여기서는 Super Mario 3 롬 파일 1개만 복사했습니다. 

순정 상태의 Game & Watch 는 Flash Memory 사이즈가 1MB 밖에 되지 않으므로 롬을 여러개 넣으면 용량 초과로 플래싱이 실패합니다.  

만약 롬 파일을 여러개 넣고 싶은 경우에는 보드에 박혀있는 Flash Memory 를 16MB로 교체해야 합니다.

 

root@ubuntu:/home/ubuntu# cp Super\ Mario\ Bros.\ 3.nes game-and-watch-retro-go/roms/nes/

 

3. 준비되면 빌드를 합니다. 빌드가 완료된 후 이어서 플래싱이 진행됩니다.

root@ubuntu:/home/ubuntu/game-and-watch-retro-go# make flash

만약 빌드에 실패할 경우, make clean 으로 빌드를 초기화 하고 다시 빌드해주세요.

 

 

 

 

빌드 및 플래싱에 성공할 경우 Game & Watch 의 화면은 아래와 같이 흰색으로 점멸하다가 자동으로 Retro-Go 메뉴 화면으로 진입합니다.

https://youtu.be/ghkvMrjxGY4

 

 

에러 케이스

용량 부족

아래와 같은 메시지가 표시되면 ROM갯수를 줄이고 다시 빌드해주세요.

/opt/gcc-arm-none-eabi-10-2020-q4-major/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld: region `EXTFLASH' overflowed by 32487 bytes
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile.common:366: build/gw_retro_go.elf] Error 1
make[1]: Leaving directory '/home/ubuntu/game-and-watch-retro-go'
make: *** [Makefile.common:428: flash] Error 2

 

 

테스트 클립 단락

테스트 클립으로 연결하는 것은 임시 방편이라 살짝만 건드려도 연결이 손상될 수 있습니다. 

 

디버그 모드 필요

커넥트 까지는 정상이나 ,침셋 정보를 가져오지 못하는 경우에는 기기를 디버그모드로 연결 후 다시 플래싱을 시도한다.

 

 

환경변수

라즈베리파이를 재시작 한 경우, retro-go 플래싱을 하기 전에 OPENOCD 환경변수를 다시 지정해주세요.

OPENOCD 경로를 환경변수로 추가하지 않아서 발생한 오류입니다. 

 

 

전원버튼을 누른채로 USB-C 케이블을 연결해서 디버그모드로 재시도합니다.

 

이 글에 있을 수 있는 오류로 인하였거나 이 블로그에 있는 정보나 소프트웨어의 활용의 결과로 발생한 기대이익의 손해와 간접손해 또는 부수적 손해에 대하여 책임을 지지 않습니다.