63
63
printf ("lcd_mod:%d\n", lcd_dev->mod);
64
64
switch (lcd_dev->mod) {
67
lcd_dev->lcd_open = gtk_lcd_open;
68
lcd_dev->lcd_close = gtk_lcd_close;
69
lcd_dev->lcd_update = gtk_lcd_update;
70
lcd_dev->lcd_read = gtk_lcd_read;
71
lcd_dev->lcd_write = gtk_lcd_write;
67
ret = gtk_lcd_init(lcd_dev);
76
lcd_dev->lcd_open = win32_lcd_open;
77
lcd_dev->lcd_close = win32_lcd_close;
78
lcd_dev->lcd_update = win32_lcd_update;
79
lcd_dev->lcd_read = win32_lcd_read;
80
lcd_dev->lcd_write = win32_lcd_write;
72
ret = win32_lcd_init(lcd_dev);
85
lcd_dev->lcd_open = beos_lcd_open;
86
lcd_dev->lcd_close = beos_lcd_close;
87
lcd_dev->lcd_update = beos_lcd_update;
88
lcd_dev->lcd_read = beos_lcd_read;
89
lcd_dev->lcd_write = beos_lcd_write;
77
ret = beos_lcd_init(lcd_dev);
99
90
dev->dev = (void *) lcd_dev;
103
94
static struct device_module_set lcd_mod_set = {
122
113
/* help functions. */
114
unsigned char* skyeye_find_lcd_dma (struct lcd_device *lcd_dev)
116
unsigned char *dma = NULL;
118
if (lcd_dev == NULL ||
119
skyeye_config.arch == NULL ||
120
skyeye_config.arch->arch_name == NULL) return NULL;
122
if (strcmp(skyeye_config.arch->arch_name, "arm") == 0) { /* arm */
123
extern mem_bank_t *bank_ptr(ARMword addr);
125
ARMul_State *state = (ARMul_State*)lcd_dev->state;
127
if(!(state == NULL || (mbp = bank_ptr(lcd_dev->lcd_addr_begin)) == NULL)) {
128
dma = (unsigned char*)(&state->mem.rom[(mbp - state->mem_bank->mem_banks)]
129
[(lcd_dev->lcd_addr_begin - mbp->addr) >> 2]);
133
if (strcmp(skyeye_config.arch->arch_name, "mips") == 0) { /* mips */
134
extern mips_mem_state_t mips_mem;
135
extern mips_mem_bank_t *mips_global_mbp;
136
extern mips_mem_config_t mips_mem_config;
138
unsigned long addr, len;
140
for (i = 0; i < mips_mem_config.bank_num; i++) {
141
addr = mips_mem_config.mem_banks[i].addr;
142
len = mips_mem_config.mem_banks[i].len;
143
if (addr <= lcd_dev->lcd_addr_begin && addr + len > lcd_dev->lcd_addr_begin) break;
146
if (i != mips_mem_config.bank_num) {
147
dma = (unsigned char*)&(mips_mem.rom[mips_global_mbp - mips_mem_config.mem_banks]
148
[(lcd_dev->lcd_addr_begin - mips_global_mbp->addr) >> 2]);
152
/* TODO: blackfin, coldfire, etc. */
157
void skyeye_convert_color_from_lcd_dma (struct lcd_device *lcd,
158
int x, int y, int w, int h,
159
void (*func)(u32, void*, void*),
160
void *user_data1, void *user_data2)
162
const u8 *dma = skyeye_find_lcd_dma(lcd);
167
int dx, dy, exw, exb, line_width;
170
if (dma == NULL || lcd->lcd_lookup_color == NULL || func == NULL) return;
171
if (!(lcd->depth == 1 || lcd->depth == 2 || lcd->depth == 4 ||
172
lcd->depth == 8 || lcd->depth == 16 || lcd->depth == 32)) return;
173
if (lcd->width <= 0 || x < 0 || w <= 0 || x + w > lcd->width) return;
174
if (lcd->height <= 0 || y < 0 || h <= 0 || y + h > lcd->height) return;
176
line_width = (lcd->width + (int)lcd->lcd_line_offset);
178
for (dy = y; dy < y + h; dy++) {
180
exw = (((line_width * dy + x) * lcd->depth) % 32) / 8;
181
exb = ((line_width * dy + x) * lcd->depth) % 8;
182
buf = (const u32*)(dma + 4 * (((line_width * dy + x) * lcd->depth) / 32));
184
for (dx = x; dx < x + w; buf++) {
187
#ifndef HOST_IS_BIG_ENDIAN
188
if (lcd->lcd_dma_swap_word == 1) {
190
if (lcd->lcd_dma_swap_word == 0) {
192
block = (((block & 0xff) << 24) |
193
((block & 0xff00) << 8) |
194
((block & 0xff0000) >> 8) |
198
buf16 = (u16*)█
200
for (i = exw; i < 4 && dx < x + w; exw = 0) {
201
if (lcd->depth < 16) { /* lcd->depth: 1, 2, 4, 8 */
202
color = (u32)(*(buf8 + (lcd->lcd_color_right_to_left == 0 ? i : 3 - i)));
203
for (k = exb; k < 8 && dx < x + w; k += lcd->depth, exb = 0) {
204
if (lcd->lcd_color_right_to_left == 0)
205
c = ((color >> (8 - (k + lcd->depth))) & ((1 << lcd->depth) - 1));
207
c = ((color >> k) & ((1 << lcd->depth) - 1));
208
(*func)(lcd->lcd_lookup_color(lcd, c), user_data1, user_data2);
213
else if (lcd->depth == 16) {
214
if (lcd->lcd_color_right_to_left == 0)
215
color = (u32)(*(buf16 + (i == 0 ? 0 : 1)));
217
color = (u32)(*(buf16 + (i == 0 ? 1 : 0)));
218
(*func)(lcd->lcd_lookup_color(lcd, color), user_data1, user_data2);
221
} else { /* lcd->depth: 32 */
223
(*func)(lcd->lcd_lookup_color(lcd, color), user_data1, user_data2);