Line 61... |
Line 61... |
/* Write a register */
|
/* Write a register */
|
void fb_write32 (oraddr_t addr, uint32_t value, void *dat)
|
void fb_write32 (oraddr_t addr, uint32_t value, void *dat)
|
{
|
{
|
struct fb_state *fb = dat;
|
struct fb_state *fb = dat;
|
|
|
oraddr_t a = (addr - fb->baseaddr);
|
switch (addr) {
|
|
|
switch (a) {
|
|
case FB_CTRL: fb->ctrl = value; break;
|
case FB_CTRL: fb->ctrl = value; break;
|
case FB_BUFADDR: change_buf_addr (fb, value); break;
|
case FB_BUFADDR: change_buf_addr (fb, value); break;
|
case FB_CAMBUFADDR: fb->cam_addr = value; break;
|
case FB_CAMBUFADDR: fb->cam_addr = value; break;
|
case FB_CAMPOSADDR: fb->camera_pos = value;
|
case FB_CAMPOSADDR: fb->camera_pos = value;
|
fb->camerax = value % FB_SIZEX;
|
fb->camerax = value % FB_SIZEX;
|
fb->cameray = value / FB_SIZEX;
|
fb->cameray = value / FB_SIZEX;
|
break;
|
break;
|
default:
|
default:
|
a -= FB_PAL;
|
addr -= FB_PAL;
|
a /= 4;
|
addr /= 4;
|
if (a < 0 || a >= 256) {
|
if (addr < 0 || addr >= 256) {
|
fprintf (stderr, "Write out of palette buffer (0x%"PRIxADDR")!\n", addr);
|
fprintf (stderr, "Write out of palette buffer (0x%"PRIxADDR")!\n", addr);
|
} else fb->pal[a] = value;
|
} else fb->pal[addr] = value;
|
break;
|
break;
|
}
|
}
|
}
|
}
|
|
|
/* Read a register */
|
/* Read a register */
|
oraddr_t fb_read32 (oraddr_t addr, void *dat)
|
oraddr_t fb_read32 (oraddr_t addr, void *dat)
|
{
|
{
|
struct fb_state *fb = dat;
|
struct fb_state *fb = dat;
|
|
|
oraddr_t a = (addr - fb->baseaddr);
|
switch (addr) {
|
|
|
switch (a) {
|
|
case FB_CTRL:
|
case FB_CTRL:
|
return fb->ctrl & ~0xff000000| (fb->in_refresh ? 0x80000000 : 0) | ((unsigned long)(fb->refresh_count & 0x7f) << 24);
|
return fb->ctrl & ~0xff000000| (fb->in_refresh ? 0x80000000 : 0) | ((unsigned long)(fb->refresh_count & 0x7f) << 24);
|
break;
|
break;
|
case FB_BUFADDR: return fb->addr; break;
|
case FB_BUFADDR: return fb->addr; break;
|
case FB_CAMBUFADDR: return fb->cam_addr; break;
|
case FB_CAMBUFADDR: return fb->cam_addr; break;
|
case FB_CAMPOSADDR: return fb->camera_pos; break;
|
case FB_CAMPOSADDR: return fb->camera_pos; break;
|
default:
|
default:
|
a -= FB_PAL;
|
addr -= FB_PAL;
|
a /= 4;
|
addr /= 4;
|
if (a < 0 || a >= 256) {
|
if (addr < 0 || addr >= 256) {
|
fprintf (stderr, "Read out of palette buffer (0x%"PRIxADDR")!\n", addr);
|
fprintf (stderr, "Read out of palette buffer (0x%"PRIxADDR")!\n", addr);
|
return 0;
|
return 0;
|
} else return fb->pal[a];
|
} else return fb->pal[addr];
|
}
|
}
|
}
|
}
|
|
|
/* define these also for big endian */
|
/* define these also for big endian */
|
#if __BIG_ENDIAN__
|
#if __BIG_ENDIAN__
|
Line 366... |
Line 362... |
}
|
}
|
|
|
void fb_sec_end(void *dat)
|
void fb_sec_end(void *dat)
|
{
|
{
|
struct fb_state *fb = dat;
|
struct fb_state *fb = dat;
|
|
struct mem_ops ops;
|
|
|
if(!fb->enabled) {
|
if(!fb->enabled) {
|
free(dat);
|
free(dat);
|
return;
|
return;
|
}
|
}
|
|
|
if (fb->baseaddr)
|
memset(&ops, 0, sizeof(struct mem_ops));
|
register_memoryarea(fb->baseaddr, FB_PAL + 256*4, 4, 0, fb_read32, fb_write32, dat);
|
|
|
ops.readfunc32 = fb_read32;
|
|
ops.writefunc32 = fb_write32;
|
|
ops.write_dat32 = dat;
|
|
ops.read_dat32 = dat;
|
|
|
|
/* FIXME: Correct delay? */
|
|
ops.delayr = 2;
|
|
ops.delayw = 2;
|
|
|
|
reg_mem_area(fb->baseaddr, FB_PAL + 256*4, 0, &ops);
|
|
|
reg_sim_reset(fb_reset, dat);
|
reg_sim_reset(fb_reset, dat);
|
}
|
}
|
|
|
void reg_fb_sec(void)
|
void reg_fb_sec(void)
|