mirror of https://github.com/zeldaret/tp.git
176 lines
4.9 KiB
C
176 lines
4.9 KiB
C
#ifndef _REVOLUTION_SI_H_
|
|
#define _REVOLUTION_SI_H_
|
|
|
|
#include <revolution/os.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define SI_MAX_CHAN 4
|
|
#define SI_MAX_TYPE 4
|
|
|
|
#define SI_COMCSR_IDX 13
|
|
#define SI_STATUS_IDX 14
|
|
|
|
#define SI_COMCSR_TCINT_MASK (1 << 31)
|
|
#define SI_COMCSR_TCINTMSK_MASK (1 << 30)
|
|
#define SI_COMCSR_COMERR_MASK (1 << 29)
|
|
#define SI_COMCSR_RDSTINT_MASK (1 << 28)
|
|
#define SI_COMCSR_RDSTINTMSK_MASK (1 << 27)
|
|
|
|
// 4 bits of padding
|
|
#define SI_COMCSR_OUTLNGTH_MASK (1 << 22) \
|
|
| (1 << 21) \
|
|
| (1 << 20) \
|
|
| (1 << 19) \
|
|
| (1 << 18) \
|
|
| (1 << 17) \
|
|
| (1 << 16)
|
|
|
|
// 1 bit of padding
|
|
#define SI_COMCSR_INLNGTH_MASK (1 << 14) \
|
|
| (1 << 13) \
|
|
| (1 << 12) \
|
|
| (1 << 11) \
|
|
| (1 << 10) \
|
|
| (1 << 9) \
|
|
| (1 << 8)
|
|
|
|
// 5 bits of padding
|
|
#define SI_COMCSR_CHANNEL_MASK (1 << 2) \
|
|
| (1 << 1)
|
|
|
|
#define SI_COMCSR_TSTART_MASK (1 << 0)
|
|
|
|
#define SI_ERROR_UNDER_RUN 0x0001
|
|
#define SI_ERROR_OVER_RUN 0x0002
|
|
#define SI_ERROR_COLLISION 0x0004
|
|
#define SI_ERROR_NO_RESPONSE 0x0008
|
|
#define SI_ERROR_WRST 0x0010
|
|
#define SI_ERROR_RDST 0x0020
|
|
#define SI_ERROR_UNKNOWN 0x0040
|
|
#define SI_ERROR_BUSY 0x0080
|
|
|
|
#define SI_TYPE_MASK 0x18000000u
|
|
#define SI_TYPE_N64 0x00000000u
|
|
#define SI_TYPE_DOLPHIN 0x08000000u
|
|
#define SI_TYPE_GC SI_TYPE_DOLPHIN
|
|
#define SI_GC_WIRELESS 0x80000000
|
|
#define SI_GC_NOMOTOR 0x20000000
|
|
#define SI_GC_STANDARD 0x01000000
|
|
#define SI_WIRELESS_RECEIVED 0x40000000
|
|
#define SI_WIRELESS_IR 0x04000000
|
|
#define SI_WIRELESS_STATE 0x02000000
|
|
#define SI_WIRELESS_ORIGIN 0x00200000
|
|
#define SI_WIRELESS_FIX_ID 0x00100000
|
|
#define SI_WIRELESS_TYPE 0x000f0000
|
|
#define SI_WIRELESS_LITE_MASK 0x000c0000
|
|
#define SI_WIRELESS_LITE 0x00040000
|
|
#define SI_WIRELESS_CONT_MASK 0x00080000
|
|
#define SI_WIRELESS_CONT 0x00000000
|
|
#define SI_WIRELESS_ID 0x00c0ff00
|
|
#define SI_WIRELESS_TYPE_ID (SI_WIRELESS_TYPE | SI_WIRELESS_ID)
|
|
#define SI_N64_CONTROLLER (SI_TYPE_N64 | 0x05000000)
|
|
#define SI_N64_MIC (SI_TYPE_N64 | 0x00010000)
|
|
#define SI_N64_KEYBOARD (SI_TYPE_N64 | 0x00020000)
|
|
#define SI_N64_MOUSE (SI_TYPE_N64 | 0x02000000)
|
|
#define SI_GBA (SI_TYPE_N64 | 0x00040000)
|
|
#define SI_GC_CONTROLLER (SI_TYPE_GC | SI_GC_STANDARD)
|
|
#define SI_GC_RECEIVER (SI_TYPE_GC | SI_GC_WIRELESS)
|
|
#define SI_GC_WAVEBIRD (SI_TYPE_GC | SI_GC_WIRELESS | SI_GC_STANDARD | SI_WIRELESS_STATE | SI_WIRELESS_FIX_ID)
|
|
#define SI_GC_KEYBOARD (SI_TYPE_GC | 0x00200000)
|
|
#define SI_GC_STEERING (SI_TYPE_GC | 0x00000000)
|
|
|
|
typedef void (*SICallback)(s32 chan, u32 sr, OSContext *context);
|
|
typedef void (*SITypeCallback)(s32 chan, u32 type);
|
|
|
|
typedef struct {
|
|
s32 chan;
|
|
u32 poll;
|
|
u32 inputBytes;
|
|
void* input;
|
|
SICallback callback;
|
|
} SIControl;
|
|
|
|
typedef struct {
|
|
s32 chan;
|
|
void* output;
|
|
u32 outputBytes;
|
|
void* input;
|
|
u32 inputBytes;
|
|
SICallback callback;
|
|
OSTime fire;
|
|
} SIPacket;
|
|
|
|
// SIBios
|
|
BOOL SIBusy(void);
|
|
BOOL SIIsChanBusy(s32 chan);
|
|
BOOL SIRegisterPollingHandler(__OSInterruptHandler handler);
|
|
BOOL SIUnregisterPollingHandler(__OSInterruptHandler handler);
|
|
void SIInit(void);
|
|
u32 SISync(void);
|
|
u32 SIGetStatus(s32 chan);
|
|
void SISetCommand(s32 chan, u32 command);
|
|
u32 SIGetCommand(s32 chan);
|
|
void SITransferCommands(void);
|
|
u32 SISetXY(u32 x, u32 y);
|
|
u32 SIEnablePolling(u32 poll);
|
|
u32 SIDisablePolling(u32 poll);
|
|
BOOL SIGetResponse(s32 chan, void* data);
|
|
BOOL SITransfer(s32 chan, void* output, u32 outputBytes, void* input, u32 inputBytes, SICallback callback, OSTime delay);
|
|
u32 SIGetType(s32 chan);
|
|
u32 SIGetTypeAsync(s32 chan, SITypeCallback callback);
|
|
u32 SIDecodeType(u32 type);
|
|
u32 SIProbe(s32 chan);
|
|
char* SIGetTypeString(u32 type);
|
|
|
|
extern u32 __PADFixBits;
|
|
|
|
// SISamplingRate
|
|
void SISetSamplingRate(u32 msec);
|
|
void SIRefreshSamplingRate(void);
|
|
|
|
// SISteering
|
|
typedef void (*SISteeringCallback)(s32 chan, s32);
|
|
|
|
typedef struct {
|
|
u8 output[3];
|
|
u8 input[8];
|
|
u32 outputBytes;
|
|
u32 inputBytes;
|
|
SISteeringCallback callback;
|
|
s32 ret;
|
|
OSThreadQueue threadQueue;
|
|
void (*proc)(s32);
|
|
} SISteeringControl;
|
|
|
|
typedef struct {
|
|
u16 button;
|
|
u8 misc;
|
|
s8 steering;
|
|
u8 gas;
|
|
u8 brake;
|
|
u8 left;
|
|
u8 right;
|
|
s8 err;
|
|
} SISteeringStatus;
|
|
|
|
extern SISteeringControl __SISteering[4];
|
|
extern u32 __SISteeringEnableBits;
|
|
extern BOOL __SIResetSteering;
|
|
|
|
void SIInitSteering(void);
|
|
s32 SIResetSteeringAsync(s32 chan, SISteeringCallback callback);
|
|
s32 SIResetSteering(s32 chan);
|
|
|
|
s32 SIReadSteering(s32 chan, SISteeringStatus* status);
|
|
void (* SISetSteeringSamplingCallback(void (*callback)()))();
|
|
void SIControlSteering(s32 chan, u32 control, s32 level);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // _REVOLUTION_SI_H_
|