Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
330 lines (268 loc) · 6.44 KB

SDL_syshaptic.c

File metadata and controls

330 lines (268 loc) · 6.44 KB
 
1
/*
Apr 8, 2011
Apr 8, 2011
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Simple DirectMedia Layer
Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
20
21
22
23
24
25
26
27
28
*/
#include "SDL_config.h"
#ifdef SDL_HAPTIC_NDS
#include "SDL_haptic.h"
#include "../SDL_syshaptic.h"
#include "SDL_joystick.h"
#include <nds/memory.h>
Feb 12, 2011
Feb 12, 2011
29
#include <nds/arm9/rumble.h>
30
31
32
33
34
#define MAX_HAPTICS 1
/* right now only the ezf3in1 (and maybe official rumble pak) are supported
and there can only be one of those in at a time (in GBA slot.) */
Feb 12, 2011
Feb 12, 2011
35
static SDL_Haptic *nds_haptic = NULL;
36
Feb 12, 2011
Feb 12, 2011
37
struct haptic_hwdata
38
39
40
41
{
enum
{ NONE, OFFICIAL, EZF3IN1 } type;
int pos;
Feb 12, 2011
Feb 12, 2011
42
};
43
44
Aug 22, 2010
Aug 22, 2010
45
46
void
NDS_EZF_OpenNorWrite()
Sep 6, 2008
Sep 6, 2008
47
{
Aug 22, 2010
Aug 22, 2010
48
49
50
51
52
53
GBA_BUS[0x0FF0000] = 0xD200;
GBA_BUS[0x0000000] = 0x1500;
GBA_BUS[0x0010000] = 0xD200;
GBA_BUS[0x0020000] = 0x1500;
GBA_BUS[0x0E20000] = 0x1500;
GBA_BUS[0x0FE0000] = 0x1500;
Aug 29, 2010
Aug 29, 2010
54
}
Aug 22, 2010
Aug 22, 2010
55
Aug 29, 2010
Aug 29, 2010
56
void
Aug 22, 2010
Aug 22, 2010
57
NDS_EZF_CloseNorWrite()
Sep 6, 2008
Sep 6, 2008
58
{
Aug 22, 2010
Aug 22, 2010
59
60
61
62
63
64
65
GBA_BUS[0x0FF0000] = 0xD200;
GBA_BUS[0x0000000] = 0x1500;
GBA_BUS[0x0010000] = 0xD200;
GBA_BUS[0x0020000] = 0x1500;
GBA_BUS[0x0E20000] = 0xD200;
GBA_BUS[0x0FE0000] = 0x1500;
}
66
Sep 6, 2008
Sep 6, 2008
67
68
69
void
NDS_EZF_ChipReset()
{
Aug 22, 2010
Aug 22, 2010
70
71
72
GBA_BUS[0x0000] = 0x00F0;
GBA_BUS[0x1000] = 0x00F0;
} uint32 NDS_EZF_IsPresent()
Sep 6, 2008
Sep 6, 2008
73
{
Aug 22, 2010
Aug 22, 2010
74
vuint16 id1, id2;
75
76
77
78
79
80
81
82
83
NDS_EZF_OpenNorWrite();
GBA_BUS[0x0555] = 0x00AA;
GBA_BUS[0x02AA] = 0x0055;
GBA_BUS[0x0555] = 0x0090;
GBA_BUS[0x1555] = 0x00AA;
GBA_BUS[0x12AA] = 0x0055;
GBA_BUS[0x1555] = 0x0090;
Aug 22, 2010
Aug 22, 2010
84
85
86
id1 = GBA_BUS[0x0001];
id2 = GBA_BUS[0x1001];
if ((id1 != 0x227E) || (id2 != 0x227E)) {
Sep 6, 2008
Sep 6, 2008
87
NDS_EZF_CloseNorWrite();
Aug 22, 2010
Aug 22, 2010
88
return 0;
Sep 6, 2008
Sep 6, 2008
89
}
Aug 22, 2010
Aug 22, 2010
90
91
id1 = GBA_BUS[0x000E];
id2 = GBA_BUS[0x100E];
92
93
NDS_EZF_CloseNorWrite();
Aug 22, 2010
Aug 22, 2010
94
95
if (id1 == 0x2218 && id2 == 0x2218) {
return 1;
96
}
Aug 22, 2010
Aug 22, 2010
97
98
99
100
return 0;
}
void
NDS_EZF_SetShake(u8 pos)
101
{
Sep 6, 2008
Sep 6, 2008
102
u16 data = ((pos % 3) | 0x00F0);
Aug 22, 2010
Aug 22, 2010
103
104
105
106
107
108
GBA_BUS[0x0FF0000] = 0xD200;
GBA_BUS[0x0000000] = 0x1500;
GBA_BUS[0x0010000] = 0xD200;
GBA_BUS[0x0020000] = 0x1500;
GBA_BUS[0x0F10000] = data;
GBA_BUS[0x0FE0000] = 0x1500;
Sep 6, 2008
Sep 6, 2008
109
110
111
GBA_BUS[0] = 0x0000; /* write any value for vibration. */
GBA_BUS[0] = 0x0002;
Aug 22, 2010
Aug 22, 2010
112
}
113
114
115
116
117
118
119
120
121
122
123
124
125
static int
SDL_SYS_LogicError(void)
{
SDL_SetError("Logic error: No haptic devices available.");
return 0;
}
int
SDL_SYS_HapticInit(void)
{
int ret = 0;
Sep 6, 2008
Sep 6, 2008
126
if (isRumbleInserted()) {
127
128
129
/* official rumble pak is present. */
ret = 1;
printf("debug: haptic present: nintendo\n");
Sep 6, 2008
Sep 6, 2008
130
} else if (NDS_EZF_IsPresent()) {
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/* ezflash 3-in-1 pak is present. */
ret = 1;
printf("debug: haptic present: ezf3in1\n");
NDS_EZF_ChipReset();
} else {
printf("debug: no haptic found\n");
}
return ret;
}
const char *
SDL_SYS_HapticName(int index)
{
Sep 6, 2008
Sep 6, 2008
146
147
148
149
150
151
152
153
if (nds_haptic) {
switch (nds_haptic->hwdata->type) {
case OFFICIAL:
return "Nintendo DS Rumble Pak";
case EZF3IN1:
return "EZFlash 3-in-1 Rumble";
default:
return NULL;
154
155
156
157
158
159
160
161
162
}
}
return NULL;
}
int
SDL_SYS_HapticOpen(SDL_Haptic * haptic)
{
Sep 6, 2008
Sep 6, 2008
163
if (!haptic) {
164
165
166
return -1;
}
Feb 12, 2011
Feb 12, 2011
167
haptic->hwdata = SDL_malloc(sizeof(struct haptic_hwdata));
Sep 6, 2008
Sep 6, 2008
168
if (!haptic->hwdata) {
169
170
171
172
173
174
175
176
177
SDL_OutOfMemory();
return -1;
}
nds_haptic = haptic;
haptic->supported = SDL_HAPTIC_CONSTANT;
/* determine what is here, if anything */
haptic->hwdata->type = NONE;
Sep 6, 2008
Sep 6, 2008
178
if (isRumbleInserted()) {
179
180
/* official rumble pak is present. */
haptic->hwdata->type = OFFICIAL;
Sep 6, 2008
Sep 6, 2008
181
} else if (NDS_EZF_IsPresent()) {
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
/* ezflash 3-in-1 pak is present. */
haptic->hwdata->type = EZF3IN1;
NDS_EZF_ChipReset();
} else {
/* no haptic present */
SDL_SYS_LogicError();
return -1;
}
return 0;
}
int
SDL_SYS_HapticMouse(void)
{
return -1;
}
int
SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick)
{
return 0;
}
int
SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
{
Sep 6, 2008
Sep 6, 2008
212
/*SDL_SYS_LogicError(); */
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
return -1;
}
int
SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
{
return 0;
}
void
SDL_SYS_HapticClose(SDL_Haptic * haptic)
{
return;
}
void
SDL_SYS_HapticQuit(void)
{
return;
}
int
SDL_SYS_HapticNewEffect(SDL_Haptic * haptic,
struct haptic_effect *effect, SDL_HapticEffect * base)
{
SDL_SYS_LogicError();
return -1;
}
int
SDL_SYS_HapticUpdateEffect(SDL_Haptic * haptic,
struct haptic_effect *effect,
SDL_HapticEffect * data)
{
SDL_SYS_LogicError();
return -1;
}
int
SDL_SYS_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
Uint32 iterations)
{
SDL_SYS_LogicError();
return -1;
}
int
SDL_SYS_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
{
SDL_SYS_LogicError();
return -1;
}
void
SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
{
SDL_SYS_LogicError();
return;
}
int
SDL_SYS_HapticGetEffectStatus(SDL_Haptic * haptic,
struct haptic_effect *effect)
{
SDL_SYS_LogicError();
return -1;
}
int
SDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain)
{
SDL_SYS_LogicError();
return -1;
}
int
SDL_SYS_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
{
SDL_SYS_LogicError();
return -1;
}
int
SDL_SYS_HapticPause(SDL_Haptic * haptic)
{
SDL_SYS_LogicError();
return -1;
}
int
SDL_SYS_HapticUnpause(SDL_Haptic * haptic)
{
SDL_SYS_LogicError();
return -1;
}
int
SDL_SYS_HapticStopAll(SDL_Haptic * haptic)
{
SDL_SYS_LogicError();
return -1;
}
#endif /* SDL_HAPTIC_NDS */
/* vi: set ts=4 sw=4 expandtab: */