Add support of boot on NOR flash.
[qemu/mini2440.git] / hw / s3c24xx_template.h
blob9bd369ce460262720968e10ee3a89cc6bc351d65
1 /*
2 * Samsung S3C2410A LCD controller emulation.
4 * Copyright (c) 2007 OpenMoko, Inc.
5 * Author: Andrzej Zaborowski <andrew@openedhand.com>
7 * This code is licensed under the GNU GPL v2.
9 * Framebuffer format conversion routines.
12 # define SKIP_PIXEL(to) to += deststep
13 #if BITS == 8
14 # define COPY_PIXEL(to, from) *to = from; SKIP_PIXEL(to)
15 #elif BITS == 15 || BITS == 16
16 # define COPY_PIXEL(to, from) *(uint16_t *) to = from; SKIP_PIXEL(to)
17 #elif BITS == 24
18 # define COPY_PIXEL(to, from) \
19 *(uint16_t *) to = from; *(to + 2) = (from) >> 16; SKIP_PIXEL(to)
20 #elif BITS == 32
21 # define COPY_PIXEL(to, from) *(uint32_t *) to = from; SKIP_PIXEL(to)
22 #else
23 # error unknown bit depth
24 #endif
26 #ifdef WORDS_BIGENDIAN
27 # define SWAP_WORDS 1
28 #endif
30 #define FN_2(x) FN(x + 1) FN(x)
31 #define FN_4(x) FN_2(x + 2) FN_2(x)
32 #define FN_8(x) FN_4(x + 4) FN_4(x)
34 static void glue(s3c_draw_line1_, BITS)(uint32_t *palette,
35 uint8_t *dest, const uint8_t *src, int width, int deststep)
37 uint32_t data;
38 while (width > 0) {
39 data = *(uint32_t *) src;
40 #define FN(x) COPY_PIXEL(dest, palette[(data >> (x)) & 1]);
41 #ifdef SWAP_WORDS
42 FN_8(24)
43 FN_8(16)
44 FN_8(8)
45 FN_8(0)
46 #else
47 FN_8(0)
48 FN_8(8)
49 FN_8(16)
50 FN_8(24)
51 #endif
52 #undef FN
53 width -= 32;
54 src += 4;
58 static void glue(s3c_draw_line2_, BITS)(uint32_t *palette,
59 uint8_t *dest, const uint8_t *src, int width, int deststep)
61 uint32_t data;
62 while (width > 0) {
63 data = *(uint32_t *) src;
64 #define FN(x) COPY_PIXEL(dest, palette[(data >> ((x) * 2)) & 3]);
65 #ifdef SWAP_WORDS
66 FN_4(12)
67 FN_4(8)
68 FN_4(4)
69 FN_4(0)
70 #else
71 FN_4(0)
72 FN_4(4)
73 FN_4(8)
74 FN_4(12)
75 #endif
76 #undef FN
77 width -= 16;
78 src += 4;
82 static void glue(s3c_draw_line4_, BITS)(uint32_t *palette,
83 uint8_t *dest, const uint8_t *src, int width, int deststep)
85 uint32_t data;
86 while (width > 0) {
87 data = *(uint32_t *) src;
88 #define FN(x) COPY_PIXEL(dest, palette[(data >> ((x) * 4)) & 0xf]);
89 #ifdef SWAP_WORDS
90 FN_2(6)
91 FN_2(4)
92 FN_2(2)
93 FN_2(0)
94 #else
95 FN_2(0)
96 FN_2(2)
97 FN_2(4)
98 FN_2(6)
99 #endif
100 #undef FN
101 width -= 8;
102 src += 4;
106 static void glue(s3c_draw_line8_, BITS)(uint32_t *palette,
107 uint8_t *dest, const uint8_t *src, int width, int deststep)
109 uint32_t data;
110 while (width > 0) {
111 data = *(uint32_t *) src;
112 #define FN(x) COPY_PIXEL(dest, palette[(data >> (x)) & 0xff]);
113 #ifdef SWAP_WORDS
114 FN(24)
115 FN(16)
116 FN(8)
117 FN(0)
118 #else
119 FN(0)
120 FN(8)
121 FN(16)
122 FN(24)
123 #endif
124 #undef FN
125 width -= 4;
126 src += 4;
130 static void glue(s3c_draw_line16a_, BITS)(uint32_t *palette,
131 uint8_t *dest, const uint8_t *src, int width, int deststep)
133 uint32_t data;
134 unsigned int r, g, b;
135 while (width > 0) {
136 data = *(uint32_t *) src;
137 #ifdef SWAP_WORDS
138 data = bswap32(data);
139 #endif
140 b = (data & 0x1f) << 3;
141 data >>= 5;
142 g = (data & 0x3f) << 2;
143 data >>= 6;
144 r = (data & 0x1f) << 3;
145 data >>= 5;
146 COPY_PIXEL(dest, glue(s3c_rgb_to_pixel, BITS)(r, g, b));
147 b = (data & 0x1f) << 3;
148 data >>= 5;
149 g = (data & 0x3f) << 2;
150 data >>= 6;
151 r = (data & 0x1f) << 3;
152 COPY_PIXEL(dest, glue(s3c_rgb_to_pixel, BITS)(r, g, b));
153 width -= 2;
154 src += 4;
158 static void glue(s3c_draw_line16b_, BITS)(uint32_t *palette,
159 uint8_t *dest, const uint8_t *src, int width, int deststep)
161 uint32_t data;
162 unsigned int r, g, b;
163 while (width > 0) {
164 data = *(uint32_t *) src;
165 #ifdef SWAP_WORDS
166 data = bswap32(data);
167 #endif
168 b = (data & 0x1f) << 3;
169 data >>= 5;
170 g = (data & 0x1f) << 3;
171 data >>= 5;
172 r = (data & 0x3f) << 2;
173 data >>= 5;
174 COPY_PIXEL(dest, glue(s3c_rgb_to_pixel, BITS)(r, g, b));
175 b = (data & 0x1f) << 3;
176 data >>= 5;
177 g = (data & 0x1f) << 3;
178 data >>= 5;
179 r = (data & 0x3f) << 2;
180 COPY_PIXEL(dest, glue(s3c_rgb_to_pixel, BITS)(r, g, b));
181 width -= 2;
182 src += 4;
186 static void glue(s3c_draw_line12_, BITS)(uint32_t *palette,
187 uint8_t *dest, const uint8_t *src, int width, int deststep)
189 uint32_t data;
190 unsigned int r, g, b;
191 while (width > 0) {
192 data = *(uint32_t *) src;
193 src += 3;
194 #ifdef SWAP_WORDS
195 data = bswap32(data);
196 #endif
197 /* XXX should use (x & 0xf) << 4) | (x & 0xf) for natural
198 * colours. Otherwise the image may be a bit darkened. */
199 b = (data & 0xf00) >> 4;
200 g = (data & 0xf0) << 0;
201 r = (data & 0xf) << 4;
202 data >>= 12;
203 COPY_PIXEL(dest, glue(s3c_rgb_to_pixel, BITS)(r, g, b));
204 b = (data & 0xf00) >> 4;
205 g = (data & 0xf0) << 0;
206 r = (data & 0xf) << 4;
207 data >>= 12;
208 COPY_PIXEL(dest, glue(s3c_rgb_to_pixel, BITS)(r, g, b));
209 b = (data & 0xf00) >> 4;
210 g = (data & 0xf0) << 0;
211 r = (data & 0xf) << 4;
212 data >>= 12;
213 COPY_PIXEL(dest, glue(s3c_rgb_to_pixel, BITS)(r, g, b));
214 b = (data & 0xf00) >> 4;
215 g = (data & 0xf0) << 0;
216 r = (data & 0xf) << 4;
217 data >>= 12;
218 COPY_PIXEL(dest, glue(s3c_rgb_to_pixel, BITS)(r, g, b));
219 width -= 4;
223 static void glue(s3c_draw_line24_, BITS)(uint32_t *palette,
224 uint8_t *dest, const uint8_t *src, int width, int deststep)
226 uint32_t data;
227 unsigned int r, g, b;
228 while (width > 0) {
229 data = *(uint32_t *) src;
230 #ifdef SWAP_WORDS
231 data = bswap32(data);
232 #endif
233 b = data & 0xff;
234 data >>= 8;
235 g = data & 0xff;
236 data >>= 8;
237 r = data & 0xff;
238 COPY_PIXEL(dest, glue(s3c_rgb_to_pixel, BITS)(r, g, b));
239 width -= 1;
240 src += 4;
244 static s3c_drawfn_t glue(s3c_draw_fn_, BITS)[] =
246 glue(s3c_draw_line1_, BITS),
247 glue(s3c_draw_line2_, BITS),
248 glue(s3c_draw_line4_, BITS),
249 glue(s3c_draw_line8_, BITS),
250 glue(s3c_draw_line12_, BITS),
251 glue(s3c_draw_line16a_, BITS),
252 glue(s3c_draw_line16b_, BITS),
253 glue(s3c_draw_line24_, BITS),
256 #undef BITS
257 #undef COPY_PIXEL
258 #undef SKIP_PIXEL
260 #ifdef SWAP_WORDS
261 # undef SWAP_WORDS
262 #endif