본문 바로가기

Game/Console

[Game & Watch] 롬 교체 - 디버거 셋팅 (1/3) - 12/16 업데이트

개요

Nintendo Game & Watch 의 오리지널 롬을 백업하고 Retro-Go 에뮬레이터를 플래싱 하는 가이드입니다.

총 3편으로 구성되어 있고 각각의 내용은 다음과 같습니다.

 

1편 - 디버거 셋팅

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

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

 

 

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

 

 


디버거 선택

Game & Watch 에 데이터를 읽고 쓰기 위해서는 ARM 디버거가 반드시 필요합니다.

유튜브나 Github 등의 가이드를 보면, J-Link나 ST-Link와 같은 ARM 디버그 프로브가 필요하다고 되어 있고 주로 NUCLEO-L476RG (ST-LINK) 를 추천하고 있습니다.   

ST-Link

 

그런데 J-Link 나 ST-Link 같은 디버거는 관련 업계에 종사하는 사람이 아니라면 평소에 전혀 쓸모가 없겠죠. 

특히 Game & Watch 를 리버스엔지니어링 했던 stacksmashing이 시연에 사용한 J-Link 디버거는 기본 모델만 40만원이 넘습니다. 

J-Link

 

따라서 보편적인.. 라즈베리파이를 추천합니다.

Raspberry Pi 3B+

 

ST-Link가 약 2만5천원이고  라즈베리파이는 스펙에 따라서 4~10만원 선이라서 라즈베리파이가 더 비싸지만 다방면으로 활용할 수 있으므로 이 작업만을 위해 ARM 디버그 프로브를 구입하는 것보다는 훨씬 낫습니다.

 


준비물

  • Game & Watch 본체
  • Raspberry Pi 3B+ or 4 (가급적 4가 좋으나, 3B+ 도 가능, 16GB 이상의 SD Card)
  • Y자 스크류 드라이버 - Y00 사이즈 (샤오미 드라이버 셋트 등에 포함되어 있음)
  • 테스트 훅 케이블 3개 (Aliexpress 에서 Hook clip test leads 라고 검색)

 

RPI3B+ , 테스트 클립, Y드라이버

 


Ubuntu 설치 및 환경 설정

1. https://www.raspberrypi.org/software/ 에서 Raspberry Pi Imager 를 다운로드 후 설치.

2. 라즈베리파이 구동에 사용할 MicroSD카드를 PC에 삽입 후, Raspberry Pi Imager 를 실행.

 

3. CHOOSE OS > Ubuntu Server 20.04.X LTS (RPI 3/4/400) - 64bit 버전 선택

 

4. SD카드 선택 후 WRITE 진행

 

5. 이미지가 준비되는데 약 25분 정도 소요됩니다. 

이미지 생성 후, 아래와 같이 디스크 액세스 오류 메시지가 표시되는데 정상입니다. 무시하고 SD카드를 빼서 라즈베리파이에 장착합니다.

 

6. 최초 계정은 ubuntu / ubuntu 인데, 최초 부팅시에는 OS 자체적으로 패스워드 생성에 시간이 어느정도 소요됩니다. 따라서 로그인을 하려면 부팅이 완료된 상태에서도 5분 정도 추가로 기다려야 합니다.

부팅하자마자 로그인을 시도하면 계속 패스워드가 틀렸다고 나오니 참고해주세요.

 

7. 로그인이 되면 다음과 같이 계정을 root 로 변경 후, 패키지를 설치합니다.

ubuntu@ubuntu:~$ sudo -s
root@ubuntu:/home/ubuntu# apt-get install binutils-arm-none-eabi libftdi1 unzip git

8. OS 재시작 합니다. 재시작 후 잊지 않고 root 권한으로 변경해줍니다  (sudo -s)

root@ubuntu:/home/ubuntu#reboot

9. 오픈소스 ARM 디버깅 도구인 OPENOCD 를 설치합니다.

ubuntu 20.04 에 포함되어 있는 버전은 동작하지 않기 때문에 별도로 설치해야 합니다. 

다행히 https://github.com/kbeckmann/ubuntu-openocd-git-builder 에서 ubuntu 20.04 용으로 빌드 된 설치본을 제공해주고 있지만 해당 바이너리는 x64용이므로 RPI에서는 사용할 수 없기 때문에 직접 빌드해야 합니다. 

라즈베리파이 성능 및 SD카드의 성능에 따라 빌드 시간에 차이는 있으나, 약 30분 ~ 1시간 정도 걸립니다.

소스를 다운받아서 빌드합니다.

root@ubuntu:/home/ubuntu# git clone https://github.com/kbeckmann/ubuntu-openocd-git-builder
root@ubuntu:/home/ubuntu# cd ubuntu-openocd-git-builder/
root@ubuntu:/home/ubuntu/ubuntu-openocd-git-builder# ./build.sh

빌드 최초에 upgrade 스텝이 있는데, 이 때 만약 아래와 같이 표시되면서 에러가 나면 RPI 재시작 후, 다시 빌드 스크립트를 실행 해주시면 됩니다.

 

10. 빌드가 완료 되면 폴더안에 다음과 같이 openocd-git_*_arm64.deb 파일이 생성됩니다.  (12/16 업데이트)

 

11. arm64용 바이너리를 설치합니다.  (해당 바이너리는 계속 업데이트 되므로 소스를 받는 시점에 따라 제가 설치한 버전과 다를 수 있습니다. )

root@ubuntu:/home/ubuntu/ubuntu-openocd-git-builder#dpkg -i openocd-git_*_arm64.deb
root@ubuntu:/home/ubuntu/ubuntu-openocd-git-builder#sudo apt-get -y -f install

openocd 를 환경 변수로 추가합니다.

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

 

12. 라즈베리파이 3B+ 모델의 경우, 램이 1GB 밖에 되지 않기 때문에 나중에 Retro-Go를 빌드할 때, 메모리 부족으로 에러가 발생합니다. 빌드 도중 튕기지 않도록 swap 메모리를 생성합니다. 

root@ubuntu:/home/ubuntu#fallocate -l 4G /swapfile
root@ubuntu:/home/ubuntu#chmod 600 /swapfile
root@ubuntu:/home/ubuntu#mkswap /swapfile
root@ubuntu:/home/ubuntu#swapon /swapfile
root@ubuntu:/home/ubuntu#top

 

 

top 명령 시, 아래와 같이 표시되면 정상 적용된 것입니다.

 

12. OS 재시작시에도 스왑파일이 유지되게 하고 싶으면 아래 내용을 적용합니다.

단, swap 을 설정하면 라즈베리파이 SD카드가 매우 느려지기 때문에 가급적 롬을 교체하고자 할 때만 휘발성으로 사용하는 것이 좋습니다.

root@ubuntu:/home/ubuntu# nano /etc/fstab

그 후 아래와 같이 /swapfile swap swap defaults 0 0 입력 후 저장합니다. (Ctrl + X > Enter)

swap 설정 참고: https://help.ubuntu.com/community/SwapFaq

 

13. GNU Arm Embedded Toolchain 을 설치합니다. (Retro-Go 플래싱 할 때 필요)

 

패키지를 다운합니다.

root@ubuntu:/home/ubuntu# wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-aarch64-linux.tar.bz2

만약 위 URL 로 파일이 다운로드 되지 않으면 아래 URL 에서 aarch64용 패키지를 받아서 라즈베리파이에 넣어주세요.

https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads

 

/opt 경로로 압축을 해제합니다. 용량이 꽤 크기 때문에 다소 시간이 소요됩니다.

root@ubuntu:/home/ubuntu# tar -xjvf gcc-arm-none-eabi-10-2020-q4-major-aarch64-linux.tar.bz2 -C /opt

 

14. 심볼릭 링크를 걸기 위해 다음 명령을 실행합니다. (6/25 업데이트 잘못된 경로 수정)

(모든 라인을 실행하셔야 합니다)

root@ubuntu:/home/ubuntu#apt remove gcc-arm-none-eabi
root@ubuntu:/home/ubuntu#ln -s /opt/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-gcc /usr/bin/arm-none-eabi-gcc
root@ubuntu:/home/ubuntu#ln -s /opt/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-g++ /usr/bin/arm-none-eabi-g++
root@ubuntu:/home/ubuntu#ln -s /opt/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-gdb /usr/bin/arm-none-eabi-gdb
root@ubuntu:/home/ubuntu#apt install libncurses-dev
root@ubuntu:/home/ubuntu#ln -s /usr/lib/aarch64-linux-gnu/libncurses.so.6 /usr/lib/aarch64-linux-gnu/libncurses.so.5
root@ubuntu:/home/ubuntu#ln -s /usr/lib/aarch64-linux-gnu/libtinfo.so.6 /usr/lib/aarch64-linux-gnu/libtinfo.so.5

 

링크가 정상적으로 걸렸는지 확인합니다. 

만약 버전이 표시되지 않으면 rm -f /path/ 로 잘못걸린 심볼릭 링크를 지우고 다시 걸어주세요.

root@ubuntu:/home/ubuntu#arm-none-eabi-gcc --version
root@ubuntu:/home/ubuntu#arm-none-eabi-g++ --version
root@ubuntu:/home/ubuntu#arm-none-eabi-gdb --version

 

이상으로 환경 준비 완료 입니다.

 

2편

https://blog.razor1911.xyz/10?category=867110 

 

[Game & Watch] 롬 교체 - 분해 및 디버그 프로브 연결 (2/3)

2편에서는 Game & Watch 를 열어서 디버그 프로브에 연결합니다. Game & Watch 분해 1. Y00 혹은 Y0.6 규격의 스크류 드라이버로 후면의 나사 4개를 풉니다. 2. 전면/후면 패널 사이에 작은 플라스틱 걸쇠가

blog.razor1911.xyz