2007. 11. 14. 15:24
     

06 NDS 홈브루(Homebrew) - 소프트웨어 리셋 라이브러리(Software Reset Library)

원문 :  http://kkamagui.springnote.com/pages/558349

 

들어가기 전에...

 

0.수정사항

  • 2007/11/01 05:21:27  수정

    • resetlib의 main.c 파일과 main.cpp 파일에 포함된 함수(SoftReset)에 대한 링크 문제로 main.c를 main.cpp로 수정함
    • resetlib.h 파일에 extern "C"를 추가하여 링크 문제 해결

 

 

0.시작하면서...

 소프트웨어 리셋 라이브러리의 모체는 23 Soft Reset 분석 에 나와있는 문쉘(moonshell)의 Reset.mse 플러그인 프로그램이다. 문쉘 플러그인으로 동작하게 만든 것을 소스를 변경하여 libfat만 있으면 동작 가능하도록 수정했다.

 모든 소스에 대한 권리는 문쉘의 권리를 따르며 이 소스를 사용하거나 임의 수정하여 얻는 불이익에 대해서는 책임지지 않는다. ^^;;;

 뭐 원래 오픈 소스이기 때문에 큰일이야 나겠냐 만은... ㅡ_ㅡa... 그래도 혹시나 모르니까 미리 알려둔다.

 

1.주된 변경 사항

1.1 GBA FS -> libfat 

 앞서 말했듯이 모체는 문쉘의 소스이다. 문쉘 소스는 과거의 FAT 라이브러리인 GBA FS를 사용하기 때문에 일반적으로 사용하는 libfat와는 맞지 않다. 그렇다고 리셋 기능 때문에 GBA FS를 그대로 사용하기에는 쓸모없는 코드가 너무 많이 들어가므로 이 부분을 libfat를 사용하도록 수정했다. 이 부분에 대한 자세한 내용은 23 Soft Reset 분석 문서를 참고하면 자세하게 알 수 있다.

 

1.2 IPCEX -> IPC 

 소프트웨어적인 리셋을 위해서는 ARM9과 ARM7 모두 리셋해야 하는데, ARM7의 리셋 신호를 위해 문쉘은 IPCEX라는 별도의 구조체를 사용하고 있다. 이것을 수정하여 libnds의 기본 정보는 IPC 구조체를 그대로 사용하도록 하고, mail 관련 정보를 사용하도록 했다. 자세한 내용은 아래의 사용 예제를 보면 쉽게 알 수 있다. 

 

2.라이브러리 설치 

2.1 소스 및 라이브러리 다운로드 

 resetlib를 사용하기위해서는 헤더파일과 라이브러리 파일만 libnds 폴더에 복사해 주면 된다. 아래 첨부에 있는 resetlib.zip을 다운받아서 압축을 해제하면 아래와 같이 소스파일과 헤더파일 그리고 라이브러리 파일이 생긴다.

 resetlib1.PNG

resetlib2.PNG

<헤더 및 라이브러리>

 

2.2 라이브러리 파일 복사 

 lib 아래에 있는 라이브러리 파일을 devkitPro가 설치된 폴더에 있는 libnds\lib 폴더 아래로 복사한다.

resetlib3.PNG

<라이브러리 파일 복사>

2.3 헤더 파일 복사 

  resetlib.h 파일을  devkitPro가 설치된 폴더에 있는 libnds\include 폴더 아래로 복사한다.

resetlib4.PNG

<헤더 파일 복사>

 

 이로써 라이브러리 설치가 완료되었다. 정말 간단하지 않은가? @0@)/~!!!

 

3.사용 예제 

 resetlib를 사용하기 위해서는 makefile을 수정해서 resetlib를 추가해주는 과정과 ARM9과 ARM7 소스에서 각각 Sync를 맞춰서 SoftReset() 함수를 호출해 주는 과정이 필요하다. 즉 ARM9만 사용하게 되어있는 프로젝트는 소프트웨어 리셋을 사용할 수 없다는 말이다. 

 ARM9 프로젝트를 ARM7과 ARM9을 사용하는 프로젝트로 변경하는 것은 그렇게 어려운 일이 아니니 devkitPro 예제에 templete 폴더에 있는 combined 템플릿을 이용하여 수정하도록 하자. 

 이제 makefile 수정방법부터 하나하나 알아보자. 

 

3.1 makefile 수정 

 resetlib는 ARM9용과 ARM7 용이 따로 제작되어있다. 따라서 각각에 맞게 수정해 줘야 한다. 

 

3.1.1 ARM9 수정 

 LIBS 부분을 아래와 같이 수정하여 libfatlibreset9을 사용하도록 한다.

  1. #---------------------------------------------------------------------------------
    # any extra libraries we wish to link with the project
    #---------------------------------------------------------------------------------
    LIBS := -lfat -lnds9 -lreset9 

 

3.1.2 ARM7 수정 

 LIBS 부분을 아래와 같이 수정하여 libfatlibreset7을 사용하도록 한다. 

  1. LIBS := -lnds7 -lreset7

 

3.2 ARM9 및 ARM7 코드 

3.2.1 ARM9 코드 

 간단히 헤더를 추가하고 libfat의  fatInitDefault() 함수를 호출해서 초기화를 수행한 다음 SoftReset() 함수를 호출해 주면 된다. 아주 간단하다.

  1. // 추가해야 하는 부분
    #include <fat.h>
  2. #include <resetlib.h>
  3. //---------------------------------------------------------------------------------
    int main(void) {
    //---------------------------------------------------------------------------------
        REG_IME=0;
       
        POWER_CR = POWER_ALL_2D;
        POWER_CR |= POWER_SWAP_LCDS;
       
        irqInit();
        {
            InitVRAM();
               
            // reset library는 libfat를 사용하므로 반드시 해줘야 한다.
            fatInitDefault();
            
            // Soft Reset 실행
            SoftReset();
        }
       
        while(1);

 

3.2.2 ARM7 코드 

 아래의 코드처럼 IPC의 mailData 부분을 통해서 RESET 관련 메시지를 ARM9이 보내도록 되어있는데, 그 값을 이용해서 Sync를 맞추어 SoftReset() 을 호출하면 된다. 

  1. #include <resetlib.h>
  2. ... 생략 ... 
  3. //---------------------------------------------------------------------------------
    int main(int argc, char ** argv) {
    //---------------------------------------------------------------------------------
        irqInit();
       
        // 반드시 초기화 해야 한다.
        IPC->mailData = RESET_NULL; //====== IPC RESET Clear by Rudolph (2007/06/13)
        irqSet(IRQ_VBLANK, VblankHandler);
       
        irqEnable(IRQ_VBLANK);
       
        while (1)
        {
            swiIntrWait(1,IRQ_VBLANK); // vblank
           
            // mail IPC를 감시하면서 값이 NULL 이 아니면 리셋 하도록 한다.
            if( IPC->mailData != RESET_NULL )
            {
                SoftReset( IPC->mailData );
                while(1);
            }
        }

 좀 더 상세한 내용은 첨부에 있는 resetlibTest.zip 를 보면 된다(사실 봐도 별 소용 없다. 위의 코드가 전부이다. ㅡ_ㅡa..)

 

4.마치면서... 

 이것으로 홈브루에도 리셋 기능을 넣을 수 있게 되었다. 홈브루 실행 후 파워 버튼을 만질 일도 이젠 없다. ㅜ_ㅜ... 이 얼마나 좋은 일인가.. ㅜ_ㅜ... 라이브러리 사용법 또한 간단하니 이 얼마나 감동인가... ㅜ_ㅜ

 이제 다시 홈브루 개발의 세계로 빠져보자. @0@)/~!!! 

 

5.첨부

 

 

이 글은 스프링노트에서 작성되었습니다.


Android App

Posted by 호기심 많은 kkamagui(까마귀, 한승훈)

댓글을 달아 주세요