CATSFC/sdk-modifications/include/ds2io.h

285 lines
8.4 KiB
C
Executable file

#ifndef __DS2IO_H__
#define __DS2IO_H__
#ifndef BIT
#define BIT(a) (1<<a)
#endif
#define SCREEN_WIDTH 256
#define SCREEN_HEIGHT 192
#define AUDIO_BUFFER_COUNT 4 // in 1.2, that's 4, but in 0.13 it would be 16 [Neb]
#ifdef __cplusplus
extern "C" {
#endif
typedef struct touchPosition {
signed short x;
signed short y;
} touchPosition;
typedef struct T_INPUT
{
unsigned int keysHeld;
unsigned int keysUp;
unsigned int keysDown;
unsigned int keysDownRepeat;
touchPosition touchPt;
touchPosition movedPt;
int touchDown;
int touchUp;
int touchHeld;
int touchMoved;
}INPUT;
typedef enum KEYPAD_BITS {
KEY_A = BIT(0), //!< Keypad A button.
KEY_B = BIT(1), //!< Keypad B button.
KEY_SELECT = BIT(2), //!< Keypad SELECT button.
KEY_START = BIT(3), //!< Keypad START button.
KEY_RIGHT = BIT(4), //!< Keypad RIGHT button.
KEY_LEFT = BIT(5), //!< Keypad LEFT button.
KEY_UP = BIT(6), //!< Keypad UP button.
KEY_DOWN = BIT(7), //!< Keypad DOWN button.
KEY_R = BIT(8), //!< Right shoulder button.
KEY_L = BIT(9), //!< Left shoulder button.
KEY_X = BIT(10), //!< Keypad X button.
KEY_Y = BIT(11), //!< Keypad Y button.
KEY_TOUCH = BIT(12), //!< Touchscreen pendown.
KEY_LID = BIT(13) //!< Lid state.
} KEYPAD_BITS;
struct rtc{
volatile unsigned char year; //add 2000 to get 4 digit year
volatile unsigned char month; //1 to 12
volatile unsigned char day; //1 to (days in month)
volatile unsigned char weekday; // day of week
volatile unsigned char hours; //0 to 11 for AM, 52 to 63 for PM
volatile unsigned char minutes; //0 to 59
volatile unsigned char seconds; //0 to 59
};
struct key_buf
{
unsigned short key;
unsigned short x;
unsigned short y;
};
typedef enum SCREEN_ID
{
UP_SCREEN = 1,
DOWN_SCREEN = 2,
DUAL_SCREEN = 3,
JOINTUSE_SCREEN = 3
} SCREEN_ID;
#define UP_MASK 0x1
#define DOWN_MASK 0x2
#define DUAL_MASK 0x3
//video buffer address of up screen
extern void* up_screen_addr;
//video buffer address of down screen
extern void* down_screen_addr;
//every time call ds2_updateAudio() function, the ds2io layer will transfer
//audio_samples_per_trans *4 bytes audio data to NDS
extern unsigned int audio_samples_per_trans;
/*
* Function: initialize ds2 I/O(DS2 Input and Output) layer
* audio_samples_lenght: ds2io layer's audio buffer length, it unit is sample
* which is fixed 4(ds2io use stereo and 16-bit audio) bytes,
* audio_samples_lenght sholud be 128*n, 128 <= audio_samples_lenght <= 4096
* NOTE: the audio sampling frequence be fixed to 44.1KHz, 2 channels 16-bit
*/
extern int ds2io_init(int audio_samples_lenght);
/*
* Function: initialize ds2 I/O(DS2 Input and Output) layer (b version)
* audio_samples_lenght: ds2io layer's audio buffer length, it unit is sample
* which is fixed 4(ds2io use stereo and 16-bit audio) bytes,
* audio_samples_lenght sholud be 128*n, 128 <= audio_samples_lenght <= 4096
* audio_samples_freq: audio samples frequence, it should be among 44100, 22050,
* 11025
* reserved1: reserved for future using
* reserved2: reserved for future using
* NOTE: the audio samples are 2 channels 16-bit
*/
extern int ds2io_initb(int audio_samples_lenght, int audio_samples_freq, int reserved1,
int reserved2);
/*
* Function: update video data from buffer to screen, the ds2io layer have 2 video
* buffers for up screen and 2 video buffers for down screen, everytime
* ds2_flipScreen is called, up_screen_addr and/or down_buffer_addr
* point to the other buffer, but not always do so, see below.
* screen_num: UP_SCREEN, only update up screen
* DOWN_SCREEN, only update down screen
* DUAL_SCREEN, update both up screen and down screen
* done: after updating video data, the up_screen_addr and/or down_buffer_addr
* are ready to point the other buffer, but if the other buffer is busy:
* when done = 0, ds2_flipScreen returns without change up_screen_addr
* and/or down_buffer_addr pointer. it will not sure the graphic just
* updated will appear on the screen
* when done = 1, it will WAIT untill the other buffer idle and change
* the pointers and returns. the graphic just updated will appear on
* the screen, but please noting the word "WAIT"
* when done = 2, it will WAIT untill the other buffer idle, then return
* without change the pointers, it is convenient for GUI drawing
*/
extern void ds2_flipScreen(enum SCREEN_ID screen_num, int done);
/*
* Function: set the video buffer to a single color
* screen_num: UP_SCREEN, only set up screen buffer
* DOWN_SCREEN, only set down screen buffer
* DUAL_SCREEN, set both up screen and down screen buffer
*/
extern void ds2_clearScreen(enum SCREEN_ID screen_num, unsigned short color);
/*
* Function: there are AUDIO_BUFFER_COUNT audio buffers on the ds2io layer, this function to
* check how many buffers are occupied
*/
extern int ds2_checkAudiobuff(void);
/*
* Function: get audio buffer address
* NOTE: ds2_getAudiobuff may return NULL, even if ds2_checkAudiobuff() < AUDIO_BUFFER_COUNT.
* The fact are that, AUDIO_BUFFER_COUNT audio buffers are on NDS, the ds2io layer using
* 2 other buffers transfering data to the AUDIO_BUFFER_COUNT audio buffers alternately,
* this function checks the 2 buffers in ds2io layers whether are occupied,
* it will return the address of the idle buffer, else it return NULL
*/
extern void* ds2_getAudiobuff(void);
/*
* Function: flush audio data from buffer to ds2io layer
NOTE: execution of the function ds2_updateAudio() only put audio data transfer request to wait queue,
it is not equal that the audio data reach NDS buffer.
*/
extern void ds2_updateAudio(void);
/*
* Function: set audio info
* audio_samples_freq: default freq 44100Hz
* audio_sample_bit: 16bit
* audio_samples_lenght: sholud be 128*n, 128 <= audio_samples_lenght <= 4096
* channels: 2
* data_format: 0: interleave(L R L R L R L R ...) 1: group(L L L L ...R R R R ...)
*/
void ds2_setAudio( unsigned int audio_samples_freq, int audio_sample_bit, unsigned int audio_samples_lenght, int channels, int data_format );
#ifndef RGB15
#define RGB15(r,g,b) (((r)|((g)<<5)|((b)<<10))|BIT(15))
#endif
/*
* Functin: get time
*/
extern void ds2_getTime(struct rtc *time);
/*
* Function: get brightness of the screens
* return: fours levels 0, 1, 2, 3
*/
extern int ds2_getBrightness(void);
/*
* Function: set brightness of the screens
* Input: level, there are 4 levels, 0, 1, 2 and 3
*/
extern void ds2_setBrightness(int level);
/*
* Function: get the swaping state of the screens
*/
extern int ds2_getSwap(void);
/*
* Funciotn: swap up screen and down screen
*/
extern void ds2_setSwap(int swap);
/*
* Function: get backlight status
* input bit0 = 0 set down screen's backlight off
* bit0 = 1 set down screen's backlight on
* bit1 = 0 set up screen's backlight off
* bit1 = 1 set up screen's backlight on
*/
extern void ds2_setBacklight(int backlight);
/*
* Function: get backlight status
* return bit0 = 0 the down screen's backlight is off
* bit0 = 1 the down screen's backlight is on
* bit1 = 0 the up screen's backlight is off
* bit1 = 1 the up screen's backlight is on
*/
extern int ds2_getBacklight(void);
/*
* Function: system suspend
*/
extern void ds2_setSupend(void);
/*
* Function: system wakeup
*/
extern void ds2_wakeup(void);
/*
* Function: NDS power offf
*/
extern void ds2_shutdown(void);
/*
* Function: set volume of NDS
* Input: volume 0- mute
* 1 - 127 hardware adjust the volume
* 128-255 software adjust the volume, when close to 255, the sound may
* be saturation distortion
*/
extern void ds2_setVolume(int volume);
/*
* Funciton: get key value and touch screen position value
*/
extern void ds2_getrawInput(struct key_buf *input);
/*
* Function: system exit, return to DSTWO Menu
*/
extern void ds2_plug_exit(void);
/*
* Function: return ds2sdk version string
*/
extern const char* ds2_getVersion(void);
/*
* Function: Register a function for debug purpos, such as CONSOLE. when keys
* pressed, function fun will be called in the interruption
*/
extern void regist_escape_key(void (*fun)(void), unsigned int keys);
/*
* Function: release the function fointer registered by regist_escape_key
*/
extern void release_escape_key(void);
#ifdef __cplusplus
}
#endif
#endif //__DS2IO_H__