참고. 디버그 영역을 이용한 가상 IPC 통신
원문 : http://kkamagui.springnote.com/pages/423568
들어가기 전에...
- 이 글은 kkamagui에 의해 작성된 글입니다.
- 마음껏 인용하시거나 사용하셔도 됩니다. 단 출처(http://kkamagui.tistory.com, http://kkamagui.springnote.com)는 밝혀 주십시오.
- 기타 사항은 mint64os at gmail.com 이나 http://kkamagui.tistory.com으로 보내주시면 반영하겠습니다.
- OS 제작에 대한 상세한 내용은 책 "64비트 멀티코어 OS 구조와 원리"를 참고하기 바랍니다.
0.시작하면서...
NDS는 ARM9과 ARM7 간의 통신을 위해 IPC 통신 기능을 가지고 있다. 하지만 IPC 설정을 해줘야 하고 보낼 수 있는 데이터의 양도 최대 64byte까지로 한정되어있기 때문에 무엇인가 부족한 면이 있다.
그렇기에 libnds에서는 ARM7과 ARM9이 공유하는 메모리를 이용해서 가상의 IPC 기능을 구현했는데, \devkitPro\libnds\source\include\nds 폴더에 ipc.h 파일에 나와있다.
//---------------------------------------------------------------------------------
typedef struct sTransferSoundData {
//---------------------------------------------------------------------------------
const void *data;
u32 len;
u32 rate;
u8 vol;
u8 pan;
u8 format;
u8 PADDING;
} TransferSoundData, * pTransferSoundData;
//---------------------------------------------------------------------------------
typedef struct sTransferSound {
//---------------------------------------------------------------------------------
TransferSoundData data[16];
u8 count;
u8 PADDING[3];
} TransferSound, * pTransferSound;
//---------------------------------------------------------------------------------
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- uint16 buttons; // X, Y, /PENIRQ buttons
- union {
vuint8 curtime[8]; // current time response from RTC - struct {
vu8 command;
vu8 year; //add 2000 to get 4 digit year
vu8 month; //1 to 12
vu8 day; //1 to (days in month) - 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; - uint16 battery; // battery life ?? hopefully. :)
uint16 aux; // i have no idea... - // Don't rely on these below, will change or be removed in the future
pTransferSound soundData; - vuint32 mailAddr;
vuint32 mailData;
vuint8 mailRead;
vuint8 mailBusy;
vuint32 mailSize;
} TransferRegion, * pTransferRegion;
static inline
TransferRegion volatile * getIPC(); // __attribute__ ((deprecated));- static inline
TransferRegion volatile * getIPC() {
return (TransferRegion volatile *)(0x027FF000);
}
TransferRegion 이라는 구조체를 정의해서 사용하는데, 터치 스크린의 좌표 및 RTC, 그리고 Sound 데이터 모두가 위의 구조체에 들어있다. 그리고 구조체가 존재하는 영역은 0x027FF000 으로 이 영역은 메인 메모리 영역이다. 일반적으로는 사용할 수 없고 Debug 모드일때 8Mbyte로 메모리가 확장되는데 그때 사용할 수 있는 영역이다. NDS 홈브루 실행 시에 디버그 모드로 진입하는지는 확실치 않으나 저 영역은 디버그 모드가 아니라도 접근할 수 있는 영역이 아닐까 조심스럽게 추측해 본다.
2.마치며...
위의 구조체를 조금 바꾸면 우리가 원하는 데이터를 끼워 넣는 것도 가능하다. 혹시 추가로 기능이 필요하면 넣어서 사용하도록 하자.
이 글은 스프링노트에서 작성되었습니다.
'NDS 홈브루(Homebrew) > 홈브루 Tutorial' 카테고리의 다른 글
참고. 터치스크린(Touch Screen)의 튐 현상 해결방안 (0) | 2007.11.14 |
---|---|
참고. 롬 파일에 데이터(사운드, 이미지 등등) 파일 포함 방법 (0) | 2007.11.14 |
참고. THUMB 코드와 ARM 코드 및 상호 호출(Interworking) (0) | 2007.11.14 |
참고. Software Reset 방법 (0) | 2007.11.14 |
참고. NDS 속도에 대한 몇가지 테스트 (0) | 2007.11.14 |