further prep for Wiz port. Cleanups, rm cpuctrl mmuhack; add warm
[libpicofe.git] / gp2x / plat.c
CommitLineData
d572cbad 1#include <stdio.h>
2#include <stdlib.h>
24b24674 3#include <string.h>
d572cbad 4#include <stdarg.h>
24b24674 5
fa5e045b 6#include "plat_gp2x.h"
d572cbad 7#include "soc.h"
fa5e045b 8#include "warm.h"
24b24674 9#include "../common/plat.h"
10#include "../common/readpng.h"
11#include "../common/menu.h"
e31266dd 12#include "../common/emu.h"
d572cbad 13#include "../linux/sndout_oss.h"
24b24674 14
d572cbad 15/* GP2X local */
fa5e045b 16int default_cpu_clock;
d572cbad 17void *gp2x_screens[4];
18
19void 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
27static 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
36void gp2x_memcpy_all_buffers(void *data, int offset, int len)
37{
38 gp2x_memcpy_buffers(0xf, data, offset, len);
39}
40
41void 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
fa5e045b 49void 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
d572cbad 65/* common */
66char cpu_clk_name[16] = "GP2X CPU clocks";
24b24674 67
68void plat_video_menu_enter(int is_rom_loaded)
69{
70 if (is_rom_loaded)
71 {
72 // darken the active framebuffer
e31266dd 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);
24b24674 76 }
77 else
78 {
79 // should really only happen once, on startup..
e31266dd 80 readpng(g_screen_ptr, "skin/background.png", READPNG_BG);
24b24674 81 }
82
83 // copy to buffer2
e31266dd 84 gp2x_memcpy_buffers((1<<2), g_screen_ptr, 0, 320*240*2);
24b24674 85
86 // switch to 16bpp
d572cbad 87 gp2x_video_changemode_ll(16);
24b24674 88 gp2x_video_RGB_setscaling(0, 320, 240);
89 gp2x_video_flip2();
90}
91
92void plat_video_menu_begin(void)
93{
d572cbad 94 memcpy(g_screen_ptr, gp2x_screens[2], 320*240*2);
24b24674 95}
96
97void plat_video_menu_end(void)
98{
d572cbad 99 // FIXME
100 // gp2x_video_flush_cache();
24b24674 101 gp2x_video_flip2();
102}
103
d572cbad 104void 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();
fa5e045b 113 default_cpu_clock = 200;
d572cbad 114 break;
115 case SOCID_POLLUX:
116 pollux_init();
117 strcpy(cpu_clk_name, "Wiz CPU clock");
fa5e045b 118 default_cpu_clock = 533;
d572cbad 119 break;
120 default:
121 fprintf(stderr, "could not recognize SoC, bailing out.\n");
122 exit(1);
123 }
124
fa5e045b 125 warm_init();
126
d572cbad 127 gp2x_memset_all_buffers(0, 0, 320*240*2);
128
129 // snd
130 sndout_oss_init();
131}
132
133void plat_finish(void)
134{
fa5e045b 135 gp2x_soc_t soc;
136
137 warm_finish();
138
139 soc = soc_detect();
140 switch (soc)
d572cbad 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
154void 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