further prep for Wiz port. Cleanups, rm cpuctrl mmuhack; add warm
[libpicofe.git] / gp2x / plat.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <stdarg.h>
5
6 #include "plat_gp2x.h"
7 #include "soc.h"
8 #include "warm.h"
9 #include "../common/plat.h"
10 #include "../common/readpng.h"
11 #include "../common/menu.h"
12 #include "../common/emu.h"
13 #include "../linux/sndout_oss.h"
14
15 /* GP2X local */
16 int default_cpu_clock;
17 void *gp2x_screens[4];
18
19 void gp2x_video_changemode(int bpp)
20 {
21         gp2x_video_changemode_ll(bpp);
22
23         gp2x_memset_all_buffers(0, 0, 320*240*2);
24         gp2x_video_flip();
25 }
26
27 static void gp2x_memcpy_buffers(int buffers, void *data, int offset, int len)
28 {
29         char *dst;
30         if (buffers & (1<<0)) { dst = (char *)gp2x_screens[0] + offset; if (dst != data) memcpy(dst, data, len); }
31         if (buffers & (1<<1)) { dst = (char *)gp2x_screens[1] + offset; if (dst != data) memcpy(dst, data, len); }
32         if (buffers & (1<<2)) { dst = (char *)gp2x_screens[2] + offset; if (dst != data) memcpy(dst, data, len); }
33         if (buffers & (1<<3)) { dst = (char *)gp2x_screens[3] + offset; if (dst != data) memcpy(dst, data, len); }
34 }
35
36 void gp2x_memcpy_all_buffers(void *data, int offset, int len)
37 {
38         gp2x_memcpy_buffers(0xf, data, offset, len);
39 }
40
41 void gp2x_memset_all_buffers(int offset, int byte, int len)
42 {
43         memset((char *)gp2x_screens[0] + offset, byte, len);
44         memset((char *)gp2x_screens[1] + offset, byte, len);
45         memset((char *)gp2x_screens[2] + offset, byte, len);
46         memset((char *)gp2x_screens[3] + offset, byte, len);
47 }
48
49 void gp2x_make_fb_bufferable(int yes)
50 {
51         int ret = 0;
52         
53         yes = yes ? 1 : 0;
54         ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[0], 320*240*2);
55         ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[1], 320*240*2);
56         ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[2], 320*240*2);
57         ret |= warm_change_cb_range(WCB_B_BIT, yes, gp2x_screens[3], 320*240*2);
58
59         if (ret)
60                 fprintf(stderr, "could not make fb buferable.\n");
61         else
62                 printf("made fb buferable.\n");
63 }
64
65 /* common */
66 char cpu_clk_name[16] = "GP2X CPU clocks";
67
68 void plat_video_menu_enter(int is_rom_loaded)
69 {
70         if (is_rom_loaded)
71         {
72                 // darken the active framebuffer
73                 memset(g_screen_ptr, 0, 320*8*2);
74                 menu_darken_bg((char *)g_screen_ptr + 320*8*2, 320*224, 1);
75                 memset((char *)g_screen_ptr + 320*232*2, 0, 320*8*2);
76         }
77         else
78         {
79                 // should really only happen once, on startup..
80                 readpng(g_screen_ptr, "skin/background.png", READPNG_BG);
81         }
82
83         // copy to buffer2
84         gp2x_memcpy_buffers((1<<2), g_screen_ptr, 0, 320*240*2);
85
86         // switch to 16bpp
87         gp2x_video_changemode_ll(16);
88         gp2x_video_RGB_setscaling(0, 320, 240);
89         gp2x_video_flip2();
90 }
91
92 void plat_video_menu_begin(void)
93 {
94         memcpy(g_screen_ptr, gp2x_screens[2], 320*240*2);
95 }
96
97 void plat_video_menu_end(void)
98 {
99         // FIXME
100         // gp2x_video_flush_cache();
101         gp2x_video_flip2();
102 }
103
104 void plat_init(void)
105 {
106         gp2x_soc_t soc;
107
108         soc = soc_detect();
109         switch (soc)
110         {
111         case SOCID_MMSP2:
112                 mmsp2_init();
113                 default_cpu_clock = 200;
114                 break;
115         case SOCID_POLLUX:
116                 pollux_init();
117                 strcpy(cpu_clk_name, "Wiz CPU clock");
118                 default_cpu_clock = 533;
119                 break;
120         default:
121                 fprintf(stderr, "could not recognize SoC, bailing out.\n");
122                 exit(1);
123         }
124
125         warm_init();
126
127         gp2x_memset_all_buffers(0, 0, 320*240*2);
128
129         // snd
130         sndout_oss_init();
131 }
132
133 void plat_finish(void)
134 {
135         gp2x_soc_t soc;
136
137         warm_finish();
138
139         soc = soc_detect();
140         switch (soc)
141         {
142         case SOCID_MMSP2:
143                 mmsp2_finish();
144                 break;
145         case SOCID_POLLUX:
146                 pollux_finish();
147                 break;
148         }
149
150         gp2x_video_changemode(16);
151         sndout_oss_exit();
152 }
153
154 void lprintf(const char *fmt, ...)
155 {
156         va_list vl;
157
158         va_start(vl, fmt);
159         vprintf(fmt, vl);
160         va_end(vl);
161 }
162