참고. 디버그 영역을 이용한 가상 IPC 통신

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

 

들어가기 전에...

 

0.시작하면서...

 NDS는 ARM9과 ARM7 간의 통신을 위해 IPC 통신 기능을 가지고 있다. 하지만 IPC 설정을 해줘야 하고 보낼 수 있는 데이터의 양도 최대 64byte까지로 한정되어있기 때문에 무엇인가 부족한 면이 있다.

 그렇기에 libnds에서는 ARM7과 ARM9이 공유하는 메모리를 이용해서 가상의 IPC 기능을 구현했는데, \devkitPro\libnds\source\include\nds 폴더에 ipc.h 파일에 나와있다.


  1. //---------------------------------------------------------------------------------
    typedef struct sTransferSoundData {
    //---------------------------------------------------------------------------------
      const void *data;
      u32 len;
      u32 rate;
      u8 vol;
      u8 pan;
      u8 format;
      u8 PADDING;
    } TransferSoundData, * pTransferSoundData;

  2. //---------------------------------------------------------------------------------
    typedef struct sTransferSound {
    //---------------------------------------------------------------------------------
      TransferSoundData data[16];
      u8 count;
      u8 PADDING[3];
    } TransferSound, * pTransferSound;

  3. //---------------------------------------------------------------------------------
    typedef struct sTransferRegion {
    //---------------------------------------------------------------------------------
     vint16 touchX,   touchY;  // TSC X, Y
     vint16 touchXpx, touchYpx; // TSC X, Y pixel values
     vint16 touchZ1,  touchZ2; // TSC x-panel measurements
     vuint16 tdiode1,  tdiode2;  // TSC temperature diodes
     vuint32 temperature;   // TSC computed temperature
  4.  uint16 buttons;    // X, Y, /PENIRQ buttons
  5.  union {
      vuint8 curtime[8];  // current time response from RTC
  6.   struct {
       vu8 command;
       vu8 year;  //add 2000 to get 4 digit year
       vu8 month;  //1 to 12
       vu8 day;   //1 to (days in month)
  7.    vu8 weekday;   // day of week
       vu8 hours;  //0 to 11 for AM, 52 to 63 for PM
       vu8 minutes;  //0 to 59
       vu8 seconds;  //0 to 59
      } rtc;
     } time;
  8.  uint16 battery;   // battery life ??  hopefully.  :)
     uint16 aux;    // i have no idea...
  9.  // Don't rely on these below, will change or be removed in the future
     pTransferSound soundData;
  10.  vuint32 mailAddr;
     vuint32 mailData;
     vuint8 mailRead;
     vuint8 mailBusy;
     vuint32 mailSize;
    } TransferRegion, * pTransferRegion;

  11. static inline
    TransferRegion volatile * getIPC(); // __attribute__ ((deprecated));
  12. static inline
    TransferRegion volatile * getIPC() {
     return (TransferRegion volatile *)(0x027FF000);

 TransferRegion 이라는 구조체를 정의해서 사용하는데, 터치 스크린의 좌표 및 RTC, 그리고 Sound 데이터 모두가 위의 구조체에 들어있다. 그리고 구조체가 존재하는 영역은 0x027FF000 으로 이 영역은 메인 메모리 영역이다. 일반적으로는 사용할 수 없고 Debug 모드일때 8Mbyte로 메모리가 확장되는데 그때 사용할 수 있는 영역이다. NDS 홈브루 실행 시에 디버그 모드로 진입하는지는 확실치 않으나 저 영역은 디버그 모드가 아니라도 접근할 수 있는 영역이 아닐까 조심스럽게 추측해 본다.

 

2.마치며...

 위의 구조체를 조금 바꾸면 우리가 원하는 데이터를 끼워 넣는 것도 가능하다. 혹시 추가로 기능이 필요하면 넣어서 사용하도록 하자.

 

 

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

+ Recent posts