minor refactoring (lprintf)
[libpicofe.git] / gp2x / plat.c
CommitLineData
d572cbad 1#include <stdio.h>
2#include <stdlib.h>
24b24674 3#include <string.h>
4
fa5e045b 5#include "plat_gp2x.h"
d572cbad 6#include "soc.h"
fa5e045b 7#include "warm.h"
24b24674 8#include "../common/plat.h"
9#include "../common/readpng.h"
10#include "../common/menu.h"
e31266dd 11#include "../common/emu.h"
902972d1 12#include "../common/input.h"
d572cbad 13#include "../linux/sndout_oss.h"
24b24674 14
fa8d1331 15#include <pico/pico.h>
16
d572cbad 17/* GP2X local */
fa5e045b 18int default_cpu_clock;
b6072c17 19int gp2x_dev_id;
20int gp2x_current_bpp;
d572cbad 21void *gp2x_screens[4];
22
902972d1 23#include <linux/input.h>
24
25static const char * const caanoo_keys[KEY_MAX + 1] = {
26 [0 ... KEY_MAX] = NULL,
27 [KEY_UP] = "Up",
28 [KEY_LEFT] = "Left",
29 [KEY_RIGHT] = "Right",
30 [KEY_DOWN] = "Down",
31 [BTN_TRIGGER] = "A",
32 [BTN_THUMB] = "X",
33 [BTN_THUMB2] = "B",
34 [BTN_TOP] = "Y",
35 [BTN_TOP2] = "L",
36 [BTN_PINKIE] = "R",
37 [BTN_BASE] = "Home",
38 [BTN_BASE2] = "Lock",
39 [BTN_BASE3] = "I",
40 [BTN_BASE4] = "II",
41 [BTN_BASE5] = "Push",
42};
43
d572cbad 44void gp2x_video_changemode(int bpp)
45{
46 gp2x_video_changemode_ll(bpp);
47
b6072c17 48 gp2x_current_bpp = bpp < 0 ? -bpp : bpp;
d572cbad 49}
50
51static void gp2x_memcpy_buffers(int buffers, void *data, int offset, int len)
52{
53 char *dst;
54 if (buffers & (1<<0)) { dst = (char *)gp2x_screens[0] + offset; if (dst != data) memcpy(dst, data, len); }
55 if (buffers & (1<<1)) { dst = (char *)gp2x_screens[1] + offset; if (dst != data) memcpy(dst, data, len); }
56 if (buffers & (1<<2)) { dst = (char *)gp2x_screens[2] + offset; if (dst != data) memcpy(dst, data, len); }
57 if (buffers & (1<<3)) { dst = (char *)gp2x_screens[3] + offset; if (dst != data) memcpy(dst, data, len); }
58}
59
60void gp2x_memcpy_all_buffers(void *data, int offset, int len)
61{
62 gp2x_memcpy_buffers(0xf, data, offset, len);
63}
64
65void gp2x_memset_all_buffers(int offset, int byte, int len)
66{
67 memset((char *)gp2x_screens[0] + offset, byte, len);
68 memset((char *)gp2x_screens[1] + offset, byte, len);
69 memset((char *)gp2x_screens[2] + offset, byte, len);
70 memset((char *)gp2x_screens[3] + offset, byte, len);
71}
72
fa5e045b 73void gp2x_make_fb_bufferable(int yes)
74{
75 int ret = 0;
76
77 yes = yes ? 1 : 0;
78 ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[0], 320*240*2);
79 ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[1], 320*240*2);
80 ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[2], 320*240*2);
81 ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[3], 320*240*2);
82
83 if (ret)
84 fprintf(stderr, "could not make fb buferable.\n");
85 else
86 printf("made fb buferable.\n");
87}
88
d572cbad 89/* common */
24b24674 90void plat_video_menu_enter(int is_rom_loaded)
91{
b6072c17 92 if (gp2x_current_bpp != 16 || gp2x_dev_id == GP2X_DEV_WIZ) {
93 /* try to switch nicely avoiding glitches */
94 gp2x_video_wait_vsync();
95 memset(gp2x_screens[0], 0, 320*240*2);
96 memset(gp2x_screens[1], 0, 320*240*2);
97 gp2x_video_flip2(); // might flip to fb2/3
98 gp2x_video_flip2(); // ..so we do it again
b6072c17 99 }
902972d1 100 else
101 gp2x_video_flip2();
b7911801 102
24b24674 103 // switch to 16bpp
d572cbad 104 gp2x_video_changemode_ll(16);
24b24674 105 gp2x_video_RGB_setscaling(0, 320, 240);
24b24674 106}
107
108void plat_video_menu_begin(void)
109{
c66f49e6 110 g_menuscreen_ptr = g_screen_ptr;
24b24674 111}
112
113void plat_video_menu_end(void)
114{
24b24674 115 gp2x_video_flip2();
116}
117
fa8d1331 118void plat_early_init(void)
d572cbad 119{
120 gp2x_soc_t soc;
b6072c17 121 FILE *f;
d572cbad 122
123 soc = soc_detect();
124 switch (soc)
125 {
126 case SOCID_MMSP2:
fa5e045b 127 default_cpu_clock = 200;
b6072c17 128 gp2x_dev_id = GP2X_DEV_GP2X;
d572cbad 129 break;
130 case SOCID_POLLUX:
fa5e045b 131 default_cpu_clock = 533;
b6072c17 132 f = fopen("/dev/accel", "rb");
133 if (f) {
134 printf("detected Caanoo\n");
135 gp2x_dev_id = GP2X_DEV_CAANOO;
136 fclose(f);
137 }
138 else {
139 printf("detected Wiz\n");
140 gp2x_dev_id = GP2X_DEV_WIZ;
141 }
d572cbad 142 break;
143 default:
1eb704b6 144 printf("could not recognize SoC, running in dummy mode.\n");
145 break;
d572cbad 146 }
b6072c17 147
902972d1 148 // just use gettimeofday until plat_init()
149 gp2x_get_ticks_ms = plat_get_ticks_ms_good;
150 gp2x_get_ticks_us = plat_get_ticks_us_good;
fa8d1331 151}
152
153void plat_init(void)
154{
155 gp2x_soc_t soc;
156
157 soc = soc_detect();
158 switch (soc)
159 {
160 case SOCID_MMSP2:
161 mmsp2_init();
162 break;
163 case SOCID_POLLUX:
164 pollux_init();
fa8d1331 165 break;
166 default:
1eb704b6 167 dummy_init();
fa8d1331 168 break;
169 }
d572cbad 170
fa5e045b 171 warm_init();
172
d572cbad 173 gp2x_memset_all_buffers(0, 0, 320*240*2);
174
114dfebd 175 // use buffer2 for menubg to save mem (using only buffers 0, 1 in menu)
d2f29611 176 g_menubg_ptr = gp2x_screens[2];
177
d572cbad 178 // snd
179 sndout_oss_init();
902972d1 180
181 if (gp2x_dev_id == GP2X_DEV_CAANOO)
182 in_set_config(in_name_to_id("evdev:pollux-analog"), IN_CFG_KEY_NAMES,
183 caanoo_keys, sizeof(caanoo_keys));
184
185 gp2x_menu_init();
d572cbad 186}
187
188void plat_finish(void)
189{
fa5e045b 190 gp2x_soc_t soc;
191
192 warm_finish();
193
194 soc = soc_detect();
195 switch (soc)
d572cbad 196 {
197 case SOCID_MMSP2:
198 mmsp2_finish();
199 break;
200 case SOCID_POLLUX:
201 pollux_finish();
202 break;
1eb704b6 203 default:
204 dummy_finish();
205 break;
d572cbad 206 }
207
d572cbad 208 sndout_oss_exit();
209}
210