debug bgm player, sound code refactoring
[libpicofe.git] / pandora / pandora.c
CommitLineData
fe017393 1\r
2#include <stdio.h>\r
3#include <stdlib.h>\r
4#include <stdarg.h>\r
5#include <string.h>\r
6#include <unistd.h>\r
7#include <sys/mman.h>\r
8#include <sys/types.h>\r
9#include <sys/stat.h>\r
10#include <sys/ioctl.h>\r
11#include <sys/soundcard.h>\r
f7c40368 12#include <linux/fb.h>\r
fe017393 13#include <fcntl.h>\r
14#include <errno.h>\r
15\r
16#include "../gp2x/gp2x.h"\r
17#include "../gp2x/usbjoy.h"\r
095a240b 18#include "../common/arm_linux.h"\r
fe017393 19\r
f7c40368 20static volatile unsigned int *memregs = MAP_FAILED;\r
fe017393 21//static\r
22int memdev = 0;\r
f7c40368 23static int fbdev = -1, sounddev = -1, mixerdev = -1, touchdev = -1;\r
fe017393 24static int touchcal[7] = { 6203, 0, -1501397, 0, -4200, 16132680, 65536 };\r
25\r
de9b1274 26//#define SCREEN_MAP_SIZE (((800*(480+11)*2)+0xfff)&~0xfff)\r
27#define SCREEN_MAP_SIZE (800*480*2)\r
f7c40368 28static void *screen = MAP_FAILED;\r
fe017393 29void *gp2x_screen;\r
30\r
fe017393 31\r
32/* video stuff */\r
33void gp2x_video_flip(void)\r
34{\r
fe017393 35}\r
36\r
37/* doulblebuffered flip */\r
38void gp2x_video_flip2(void)\r
39{\r
fe017393 40}\r
41\r
42\r
43void gp2x_video_changemode2(int bpp)\r
44{\r
fe017393 45}\r
46\r
47\r
48void gp2x_video_changemode(int bpp)\r
49{\r
fe017393 50}\r
51\r
52\r
53void gp2x_video_setpalette(int *pal, int len)\r
54{\r
fe017393 55}\r
56\r
57\r
fe017393 58void gp2x_video_RGB_setscaling(int ln_offs, int W, int H)\r
59{\r
fe017393 60}\r
61\r
62\r
63void gp2x_video_wait_vsync(void)\r
64{\r
fe017393 65}\r
66\r
fe017393 67void gp2x_video_flush_cache(void)\r
68{\r
095a240b 69// cache_flush_d_inval_i(gp2x_screen, (char *)gp2x_screen + 320*240*2, 0);\r
fe017393 70}\r
71\r
fe017393 72void gp2x_memcpy_buffers(int buffers, void *data, int offset, int len)\r
73{\r
fe017393 74}\r
75\r
76\r
77void gp2x_memcpy_all_buffers(void *data, int offset, int len)\r
78{\r
fe017393 79}\r
80\r
81\r
82void gp2x_memset_all_buffers(int offset, int byte, int len)\r
83{\r
492d353a 84 memset((char *)gp2x_screen + offset, byte, len);\r
fe017393 85}\r
86\r
87\r
88void gp2x_pd_clone_buffer2(void)\r
89{\r
095a240b 90 memset(gp2x_screen, 0, 800*480*2);\r
fe017393 91}\r
92\r
93\r
94unsigned long gp2x_joystick_read(int allow_usb_joy)\r
95{\r
492d353a 96 unsigned long value = 0;\r
fe017393 97 int i;\r
fe017393 98\r
99 if (allow_usb_joy && num_of_joys > 0) {\r
100 // check the usb joy as well..\r
101 gp2x_usbjoy_update();\r
102 for (i = 0; i < num_of_joys; i++)\r
103 value |= gp2x_usbjoy_check(i);\r
104 }\r
105\r
106 return value;\r
107}\r
108\r
109typedef struct ucb1x00_ts_event\r
110{\r
111 unsigned short pressure;\r
112 unsigned short x;\r
113 unsigned short y;\r
114 unsigned short pad;\r
115 struct timeval stamp;\r
116} UCB1X00_TS_EVENT;\r
117\r
118int gp2x_touchpad_read(int *x, int *y)\r
119{\r
120 UCB1X00_TS_EVENT event;\r
121 static int zero_seen = 0;\r
122 int retval;\r
123\r
124 if (touchdev < 0) return -1;\r
125\r
126 retval = read(touchdev, &event, sizeof(event));\r
127 if (retval <= 0) {\r
128 printf("touch read failed %i %i\n", retval, errno);\r
129 return -1;\r
130 }\r
131 // this is to ignore the messed-up 4.1.x driver\r
132 if (event.pressure == 0) zero_seen = 1;\r
133\r
134 if (x) *x = (event.x * touchcal[0] + touchcal[2]) >> 16;\r
135 if (y) *y = (event.y * touchcal[4] + touchcal[5]) >> 16;\r
136 // printf("read %i %i %i\n", event.pressure, *x, *y);\r
137\r
138 return zero_seen ? event.pressure : 0;\r
139}\r
140\r
141\r
095a240b 142static int s_oldrate = 0, s_oldbits = 0, s_oldstereo = 0;\r
fe017393 143\r
144void gp2x_start_sound(int rate, int bits, int stereo)\r
145{\r
146 int frag = 0, bsize, buffers;\r
147\r
148 // if no settings change, we don't need to do anything\r
149 if (rate == s_oldrate && s_oldbits == bits && s_oldstereo == stereo) return;\r
150\r
151 if (sounddev > 0) close(sounddev);\r
152 sounddev = open("/dev/dsp", O_WRONLY|O_ASYNC);\r
153 if (sounddev == -1)\r
154 printf("open(\"/dev/dsp\") failed with %i\n", errno);\r
155\r
156 ioctl(sounddev, SNDCTL_DSP_SETFMT, &bits);\r
157 ioctl(sounddev, SNDCTL_DSP_SPEED, &rate);\r
158 ioctl(sounddev, SNDCTL_DSP_STEREO, &stereo);\r
159 // calculate buffer size\r
160 buffers = 16;\r
161 bsize = rate / 32;\r
162 if (rate > 22050) { bsize*=4; buffers*=2; } // 44k mode seems to be very demanding\r
163 while ((bsize>>=1)) frag++;\r
164 frag |= buffers<<16; // 16 buffers\r
165 ioctl(sounddev, SNDCTL_DSP_SETFRAGMENT, &frag);\r
166 usleep(192*1024);\r
167\r
168 printf("gp2x_set_sound: %i/%ibit/%s, %i buffers of %i bytes\n",\r
169 rate, bits, stereo?"stereo":"mono", frag>>16, 1<<(frag&0xffff));\r
170\r
171 s_oldrate = rate; s_oldbits = bits; s_oldstereo = stereo;\r
172}\r
173\r
174\r
175void gp2x_sound_write(void *buff, int len)\r
176{\r
095a240b 177 write(sounddev, buff, len);\r
fe017393 178}\r
179\r
180void gp2x_sound_sync(void)\r
181{\r
492d353a 182// ioctl(sounddev, SOUND_PCM_SYNC, 0);\r
fe017393 183}\r
184\r
185void gp2x_sound_volume(int l, int r)\r
186{\r
492d353a 187#if 0\r
fe017393 188 l=l<0?0:l; l=l>255?255:l; r=r<0?0:r; r=r>255?255:r;\r
189 l<<=8; l|=r;\r
190 ioctl(mixerdev, SOUND_MIXER_WRITE_PCM, &l); /*SOUND_MIXER_WRITE_VOLUME*/\r
492d353a 191#endif\r
fe017393 192}\r
193\r
194\r
195/* common */\r
196void gp2x_init(void)\r
197{\r
f7c40368 198 struct fb_fix_screeninfo fbfix;\r
199 int ret;\r
492d353a 200\r
fe017393 201 printf("entering init()\n"); fflush(stdout);\r
202\r
203 memdev = open("/dev/mem", O_RDWR);\r
204 if (memdev == -1)\r
205 {\r
206 printf("open(\"/dev/mem\") failed with %i\n", errno);\r
207 exit(1);\r
208 }\r
f7c40368 209/*\r
492d353a 210 memregs = mmap(0, 0x01000000, PROT_READ|PROT_WRITE, MAP_SHARED, memdev, 0x48000000);\r
211 if (memregs == MAP_FAILED)\r
fe017393 212 {\r
213 printf("mmap(memregs) failed with %i\n", errno);\r
214 exit(1);\r
215 }\r
f7c40368 216*/\r
8add01a3 217 fbdev = open("/dev/fb0", O_RDWR);\r
218 if (fbdev == -1)\r
219 {\r
220 printf("open(\"/dev/fb0\") failed with %i\n", errno);\r
221 exit(1);\r
222 }\r
223\r
f7c40368 224 ret = ioctl(fbdev, FBIOGET_FSCREENINFO, &fbfix);\r
225 if (ret == -1)\r
226 {\r
227 printf("ioctl(fbdev) failed with %i\n", errno);\r
228 exit(1);\r
229 }\r
230\r
231 // squidge hack\r
232 if (fbfix.line_length != 800*2)\r
233 {\r
234 gp2x_screen = malloc(800*640*2);\r
235 return;\r
236 }\r
fe017393 237\r
492d353a 238 screen = mmap(0, SCREEN_MAP_SIZE, PROT_WRITE|PROT_READ, MAP_SHARED, fbdev, 0);\r
239 if (screen == MAP_FAILED)\r
240 {\r
241 printf("mmap(fbptr) failed with %i\n", errno);\r
242 exit(1);\r
243 }\r
244 printf("fbptr %p\n", screen);\r
de9b1274 245// gp2x_screen = (char *)screen + 800*10*2-64;\r
246 gp2x_screen = screen;\r
fe017393 247\r
fe017393 248\r
249 // snd\r
250 mixerdev = open("/dev/mixer", O_RDWR);\r
251 if (mixerdev == -1)\r
252 printf("open(\"/dev/mixer\") failed with %i\n", errno);\r
253\r
254 /* init usb joys -GnoStiC */\r
255 gp2x_usbjoy_init();\r
256\r
257 // touchscreen\r
258 touchdev = open("/dev/touchscreen/wm97xx", O_RDONLY);\r
259 if (touchdev >= 0) {\r
260 FILE *pcf = fopen("/etc/pointercal", "r");\r
261 if (pcf) {\r
262 fscanf(pcf, "%d %d %d %d %d %d %d", &touchcal[0], &touchcal[1],\r
263 &touchcal[2], &touchcal[3], &touchcal[4], &touchcal[5], &touchcal[6]);\r
264 fclose(pcf);\r
265 }\r
266 printf("found touchscreen/wm97xx\n");\r
267 }\r
268\r
fe017393 269 printf("exitting init()\n"); fflush(stdout);\r
270}\r
271\r
fe017393 272void gp2x_deinit(void)\r
273{\r
492d353a 274 //gp2x_video_changemode(15);\r
fe017393 275\r
f7c40368 276 if (screen != MAP_FAILED)\r
277 munmap(screen, SCREEN_MAP_SIZE);\r
278 if (memregs != MAP_FAILED)\r
279 munmap((void *)memregs, 0x10000);\r
fe017393 280 close(memdev);\r
f7c40368 281 if (fbdev >= 0) close(fbdev);\r
492d353a 282 if (mixerdev >= 0) close(mixerdev);\r
fe017393 283 if (sounddev >= 0) close(sounddev);\r
284 if (touchdev >= 0) close(touchdev);\r
285\r
286 gp2x_usbjoy_deinit();\r
287\r
492d353a 288 printf("all done");\r
fe017393 289}\r
290\r
291/* lprintf */\r
292void lprintf(const char *fmt, ...)\r
293{\r
294 va_list vl;\r
295\r
296 va_start(vl, fmt);\r
297 vprintf(fmt, vl);\r
298 va_end(vl);\r
299}\r
300\r
301\r
302/* fake GP2X */\r
303int crashed_940 = 0;\r
304\r
305int readpng(void *dest, const char *fname, int what) { return -1; }\r
306void set_gamma(int g100, int A_SNs_curve) {}\r
307void set_FCLK(unsigned MHZ) {}\r
308void set_LCD_custom_rate(int rate) {}\r
309void unset_LCD_custom_rate(void) {}\r
492d353a 310void Pause940(int yes) {}\r
311void Reset940(int yes, int bank) {}\r
fe017393 312\r