OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [stable_0_2_0_rc2/] [or1ksim/] [peripheral/] [fb.c] - Diff between revs 1484 and 1486

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 1484 Rev 1486
/* fb.c -- Simple frame buffer
/* fb.c -- Simple frame buffer
   Copyright (C) 2001 Marko Mlinar, markom@opencores.org
   Copyright (C) 2001 Marko Mlinar, markom@opencores.org
 
 
This file is part of OpenRISC 1000 Architectural Simulator.
This file is part of OpenRISC 1000 Architectural Simulator.
 
 
This program is free software; you can redistribute it and/or modify
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
(at your option) any later version.
 
 
This program is distributed in the hope that it will be useful,
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
GNU General Public License for more details.
 
 
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 
 
#include <stdio.h>
#include <stdio.h>
#include <string.h>
#include <string.h>
 
 
#include "config.h"
#include "config.h"
 
 
#ifdef HAVE_INTTYPES_H
#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#include <inttypes.h>
#endif
#endif
 
 
#include "port.h"
#include "port.h"
#include "arch.h"
#include "arch.h"
#include "sim-config.h"
#include "sim-config.h"
#include "abstract.h"
#include "abstract.h"
#include "fb.h"
#include "fb.h"
#include "sched.h"
#include "sched.h"
 
 
#define FB_WRAP (512*1024)
#define FB_WRAP (512*1024)
 
 
struct fb_state {
struct fb_state {
  int enabled;
  int enabled;
  unsigned long pal[256];
  unsigned long pal[256];
  int ctrl;
  int ctrl;
  int pic;
  int pic;
  int in_refresh;
  int in_refresh;
  int refresh_count;
  int refresh_count;
  oraddr_t addr;
  oraddr_t addr;
  oraddr_t cam_addr;
  oraddr_t cam_addr;
  int camerax;
  int camerax;
  int cameray;
  int cameray;
  int camera_pos;
  int camera_pos;
  oraddr_t baseaddr;
  oraddr_t baseaddr;
  int refresh;
  int refresh;
  int refresh_rate;
  int refresh_rate;
  char *filename;
  char *filename;
};
};
 
 
static void change_buf_addr (struct fb_state *fb, oraddr_t addr)
static void change_buf_addr (struct fb_state *fb, oraddr_t addr)
{
{
  fb->addr = addr;
  fb->addr = addr;
}
}
 
 
/* 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__
#define CNV32(x) (\
#define CNV32(x) (\
     ((((x) >> 24) & 0xff) << 0)\
     ((((x) >> 24) & 0xff) << 0)\
   | ((((x) >> 16) & 0xff) << 8)\
   | ((((x) >> 16) & 0xff) << 8)\
   | ((((x) >> 8) & 0xff) << 16)\
   | ((((x) >> 8) & 0xff) << 16)\
   | ((((x) >> 0) & 0xff) << 24))
   | ((((x) >> 0) & 0xff) << 24))
#define CNV16(x) (\
#define CNV16(x) (\
     ((((x) >> 8) & 0xff) << 0)\
     ((((x) >> 8) & 0xff) << 0)\
   | ((((x) >> 0) & 0xff) << 8))
   | ((((x) >> 0) & 0xff) << 8))
#else
#else
#define CNV16(x) (x)
#define CNV16(x) (x)
#define CNV32(x) (x)
#define CNV32(x) (x)
#endif
#endif
 
 
/* Dumps a bmp file, based on current image */
/* Dumps a bmp file, based on current image */
static int fb_dump_image8 (struct fb_state *fb, char *filename)
static int fb_dump_image8 (struct fb_state *fb, char *filename)
{
{
  int sx = FB_SIZEX;
  int sx = FB_SIZEX;
  int sy = FB_SIZEY;
  int sy = FB_SIZEY;
  int i, x, y;
  int i, x, y;
  FILE *fo;
  FILE *fo;
 
 
  unsigned short int u16;
  unsigned short int u16;
  unsigned long int u32;
  unsigned long int u32;
 
 
  if (config.sim.verbose) PRINTF ("Creating %s...", filename);
  if (config.sim.verbose) PRINTF ("Creating %s...", filename);
  fo = fopen (filename, "wb+");
  fo = fopen (filename, "wb+");
  u16 = CNV16(19778); /* BM */
  u16 = CNV16(19778); /* BM */
  if (!fwrite (&u16, 2, 1, fo)) return 1;
  if (!fwrite (&u16, 2, 1, fo)) return 1;
  u32 = CNV32(14 + 40 + sx * sy + 1024); /* size */
  u32 = CNV32(14 + 40 + sx * sy + 1024); /* size */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(0); /* reserved */
  u32 = CNV32(0); /* reserved */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = 14 + 40 + 1024; /* offset */
  u32 = 14 + 40 + 1024; /* offset */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
 
  u32 = CNV32(40); /* header size */
  u32 = CNV32(40); /* header size */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(sx); /* width */
  u32 = CNV32(sx); /* width */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(sy); /* height */
  u32 = CNV32(sy); /* height */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u16 = CNV16(1);  /* planes */
  u16 = CNV16(1);  /* planes */
  if (!fwrite (&u16, 2, 1, fo)) return 1;
  if (!fwrite (&u16, 2, 1, fo)) return 1;
  u16 = CNV16(8);  /* bits */
  u16 = CNV16(8);  /* bits */
  if (!fwrite (&u16, 2, 1, fo)) return 1;
  if (!fwrite (&u16, 2, 1, fo)) return 1;
  u32 = CNV32(0);  /* compression */
  u32 = CNV32(0);  /* compression */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(x * y); /* image size */
  u32 = CNV32(x * y); /* image size */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(2835);  /* x resolution */
  u32 = CNV32(2835);  /* x resolution */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(2835);  /* y resolution */
  u32 = CNV32(2835);  /* y resolution */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(0);  /* ncolours = 0; should be generated */
  u32 = CNV32(0);  /* ncolours = 0; should be generated */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(0);  /* important colours; all are important */
  u32 = CNV32(0);  /* important colours; all are important */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
 
  for (i = 0; i < 256; i++) {
  for (i = 0; i < 256; i++) {
    unsigned long val, d;
    unsigned long val, d;
    d = fb->pal[i];
    d = fb->pal[i];
#if 1
#if 1
    val = ((d >> 0) & 0x1f) << 3;   /* Blue */
    val = ((d >> 0) & 0x1f) << 3;   /* Blue */
    val |= ((d >> 5) & 0x3f) << 10;  /* Green */
    val |= ((d >> 5) & 0x3f) << 10;  /* Green */
    val |= ((d >> 11) & 0x1f) << 19; /* Red */
    val |= ((d >> 11) & 0x1f) << 19; /* Red */
#else 
#else 
    val = CNV32(pal[i]);
    val = CNV32(pal[i]);
#endif
#endif
    if (!fwrite (&val, 4, 1, fo)) return 1;
    if (!fwrite (&val, 4, 1, fo)) return 1;
  }
  }
 
 
  if (config.sim.verbose) PRINTF ("(%i,%i)", sx, sy);
  if (config.sim.verbose) PRINTF ("(%i,%i)", sx, sy);
  /* Data is stored upside down */
  /* Data is stored upside down */
  for (y = sy - 1; y >= 0; y--) {
  for (y = sy - 1; y >= 0; y--) {
    int align = (4 - sx) % 4;
    int align = (4 - sx) % 4;
    int zero = CNV32(0);
    int zero = CNV32(0);
    int add;
    int add;
    int breakpoint;
    int breakpoint;
    while (align < 0) align += 4;
    while (align < 0) align += 4;
    for (x = 0; x < sx; x++) {
    for (x = 0; x < sx; x++) {
      add = (fb->addr & ~(FB_WRAP - 1)) | ((fb->addr + y * sx + x) & (FB_WRAP - 1));
      add = (fb->addr & ~(FB_WRAP - 1)) | ((fb->addr + y * sx + x) & (FB_WRAP - 1));
      fputc (eval_direct8 (add, &breakpoint, 0, 0), fo);
      fputc (eval_direct8 (add, &breakpoint, 0, 0), fo);
    }
    }
    if (align && !fwrite (&zero, align, 1, fo)) return 1;
    if (align && !fwrite (&zero, align, 1, fo)) return 1;
  }
  }
 
 
  if (config.sim.verbose) PRINTF ("DONE\n");
  if (config.sim.verbose) PRINTF ("DONE\n");
  fclose (fo);
  fclose (fo);
  return 0;
  return 0;
}
}
 
 
/* Dumps a bmp file, based on current image */
/* Dumps a bmp file, based on current image */
static int fb_dump_image24 (struct fb_state *fb, char *filename)
static int fb_dump_image24 (struct fb_state *fb, char *filename)
{
{
  int sx = FB_SIZEX;
  int sx = FB_SIZEX;
  int sy = FB_SIZEY;
  int sy = FB_SIZEY;
  int x, y;
  int x, y;
  FILE *fo;
  FILE *fo;
 
 
  unsigned short int u16;
  unsigned short int u16;
  unsigned long int u32;
  unsigned long int u32;
 
 
  int breakpoint;
  int breakpoint;
 
 
  if (config.sim.verbose) PRINTF ("Creating %s...", filename);
  if (config.sim.verbose) PRINTF ("Creating %s...", filename);
  fo = fopen (filename, "wb+");
  fo = fopen (filename, "wb+");
  u16 = CNV16(19778); /* BM */
  u16 = CNV16(19778); /* BM */
  if (!fwrite (&u16, 2, 1, fo)) return 1;
  if (!fwrite (&u16, 2, 1, fo)) return 1;
  u32 = CNV32(14 + 40 + sx * sy * 3); /* size */
  u32 = CNV32(14 + 40 + sx * sy * 3); /* size */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(0); /* reserved */
  u32 = CNV32(0); /* reserved */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = 14 + 40; /* offset */
  u32 = 14 + 40; /* offset */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
 
  u32 = CNV32(40); /* header size */
  u32 = CNV32(40); /* header size */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(sx); /* width */
  u32 = CNV32(sx); /* width */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(sy); /* height */
  u32 = CNV32(sy); /* height */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u16 = CNV16(1);  /* planes */
  u16 = CNV16(1);  /* planes */
  if (!fwrite (&u16, 2, 1, fo)) return 1;
  if (!fwrite (&u16, 2, 1, fo)) return 1;
  u16 = CNV16(24);  /* bits */
  u16 = CNV16(24);  /* bits */
  if (!fwrite (&u16, 2, 1, fo)) return 1;
  if (!fwrite (&u16, 2, 1, fo)) return 1;
  u32 = CNV32(0);  /* compression */
  u32 = CNV32(0);  /* compression */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(x * y * 3); /* image size */
  u32 = CNV32(x * y * 3); /* image size */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(2835);  /* x resolution */
  u32 = CNV32(2835);  /* x resolution */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(2835);  /* y resolution */
  u32 = CNV32(2835);  /* y resolution */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(0);  /* ncolours = 0; should be generated */
  u32 = CNV32(0);  /* ncolours = 0; should be generated */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  u32 = CNV32(0);  /* important colours; all are important */
  u32 = CNV32(0);  /* important colours; all are important */
  if (!fwrite (&u32, 4, 1, fo)) return 1;
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
 
  if (config.sim.verbose) PRINTF ("(%i,%i)", sx, sy);
  if (config.sim.verbose) PRINTF ("(%i,%i)", sx, sy);
  /* Data is stored upside down */
  /* Data is stored upside down */
  for (y = sy - 1; y >= 0; y--) {
  for (y = sy - 1; y >= 0; y--) {
    unsigned char line[FB_SIZEX][3];
    unsigned char line[FB_SIZEX][3];
    for (x = 0; x < sx; x++)
    for (x = 0; x < sx; x++)
      if (y >= fb->cameray && x >= fb->camerax && y < fb->cameray + CAM_SIZEY && x < fb->camerax + CAM_SIZEX) {
      if (y >= fb->cameray && x >= fb->camerax && y < fb->cameray + CAM_SIZEY && x < fb->camerax + CAM_SIZEX) {
        int add = (fb->cam_addr + (x - fb->camerax + (y - fb->cameray) * CAM_SIZEX) * 2) ^ 2;
        int add = (fb->cam_addr + (x - fb->camerax + (y - fb->cameray) * CAM_SIZEX) * 2) ^ 2;
        unsigned short d = eval_direct16 (add, &breakpoint, 0, 0);
        unsigned short d = eval_direct16 (add, &breakpoint, 0, 0);
        line[x][0] = ((d >> 0) & 0x1f) << 3;  /* Blue */
        line[x][0] = ((d >> 0) & 0x1f) << 3;  /* Blue */
        line[x][1] = ((d >> 5) & 0x3f) << 2;  /* Green */
        line[x][1] = ((d >> 5) & 0x3f) << 2;  /* Green */
        line[x][2] = ((d >> 11) & 0x1f) << 3; /* Red */
        line[x][2] = ((d >> 11) & 0x1f) << 3; /* Red */
      } else {
      } else {
        int add = (fb->addr & ~(FB_WRAP - 1)) | ((fb->addr + y * sx + x) & (FB_WRAP - 1));
        int add = (fb->addr & ~(FB_WRAP - 1)) | ((fb->addr + y * sx + x) & (FB_WRAP - 1));
        unsigned short d = fb->pal[eval_direct8 (add, &breakpoint, 0, 0)];
        unsigned short d = fb->pal[eval_direct8 (add, &breakpoint, 0, 0)];
        line[x][0] = ((d >> 0) & 0x1f) << 3;  /* Blue */
        line[x][0] = ((d >> 0) & 0x1f) << 3;  /* Blue */
        line[x][1] = ((d >> 5) & 0x3f) << 2;  /* Green */
        line[x][1] = ((d >> 5) & 0x3f) << 2;  /* Green */
        line[x][2] = ((d >> 11) & 0x1f) << 3; /* Red */
        line[x][2] = ((d >> 11) & 0x1f) << 3; /* Red */
      }
      }
    if(!fwrite (line, sizeof(line), 1, fo)) return 1;
    if(!fwrite (line, sizeof(line), 1, fo)) return 1;
  }
  }
 
 
  if (config.sim.verbose) PRINTF ("DONE\n");
  if (config.sim.verbose) PRINTF ("DONE\n");
  fclose (fo);
  fclose (fo);
  return 0;
  return 0;
}
}
 
 
void fb_job (void *dat)
void fb_job (void *dat)
{
{
  struct fb_state *fb = dat;
  struct fb_state *fb = dat;
 
 
  if (fb->refresh) {
  if (fb->refresh) {
    /* dump the image? */
    /* dump the image? */
    if (fb->ctrl & 1) {
    if (fb->ctrl & 1) {
      char temp[STR_SIZE];
      char temp[STR_SIZE];
      sprintf (temp, "%s%04i.bmp", fb->filename, fb->pic);
      sprintf (temp, "%s%04i.bmp", fb->filename, fb->pic);
      if (fb->ctrl & 2) fb_dump_image24 (fb, temp);
      if (fb->ctrl & 2) fb_dump_image24 (fb, temp);
      else fb_dump_image8 (fb, temp);
      else fb_dump_image8 (fb, temp);
      fb->pic++;
      fb->pic++;
    }
    }
    SCHED_ADD(fb_job, dat, fb->refresh_rate / REFRESH_DIVIDER);
    SCHED_ADD(fb_job, dat, fb->refresh_rate / REFRESH_DIVIDER);
    fb->in_refresh = 0;
    fb->in_refresh = 0;
    fb->refresh = 0;
    fb->refresh = 0;
  } else {
  } else {
    fb->refresh_count++;
    fb->refresh_count++;
    fb->refresh = 1;
    fb->refresh = 1;
    SCHED_ADD(fb_job, dat, fb->refresh_rate / REFRESH_DIVIDER);
    SCHED_ADD(fb_job, dat, fb->refresh_rate / REFRESH_DIVIDER);
  }
  }
}
}
 
 
/* Reset all FBs */
/* Reset all FBs */
void fb_reset (void *dat)
void fb_reset (void *dat)
{
{
  struct fb_state *fb = dat;
  struct fb_state *fb = dat;
  int i;
  int i;
 
 
  fb->pic = 0;
  fb->pic = 0;
  fb->addr = 0;
  fb->addr = 0;
  fb->ctrl = 0;
  fb->ctrl = 0;
 
 
  for (i = 0; i < 256; i++)
  for (i = 0; i < 256; i++)
    fb->pal[i] = (i << 16) | (i << 8) | (i << 0);
    fb->pal[i] = (i << 16) | (i << 8) | (i << 0);
 
 
  SCHED_ADD(fb_job, dat, fb->refresh_rate);
  SCHED_ADD(fb_job, dat, fb->refresh_rate);
  fb->refresh = 0;
  fb->refresh = 0;
}
}
 
 
/*-----------------------------------------------------[ FB configuration ]---*/
/*-----------------------------------------------------[ FB configuration ]---*/
void fb_baseaddr(union param_val val, void *dat)
void fb_baseaddr(union param_val val, void *dat)
{
{
  struct fb_state *fb = dat;
  struct fb_state *fb = dat;
  fb->baseaddr = val.addr_val;
  fb->baseaddr = val.addr_val;
}
}
 
 
void fb_refresh_rate(union param_val val, void *dat)
void fb_refresh_rate(union param_val val, void *dat)
{
{
  struct fb_state *fb = dat;
  struct fb_state *fb = dat;
  fb->refresh_rate = val.int_val;
  fb->refresh_rate = val.int_val;
}
}
 
 
void fb_filename(union param_val val, void *dat)
void fb_filename(union param_val val, void *dat)
{
{
  struct fb_state *fb = dat;
  struct fb_state *fb = dat;
  if(!(fb->filename = strdup(val.str_val))) {
  if(!(fb->filename = strdup(val.str_val))) {
    fprintf(stderr, "Peripheral FB: Run out of memory\n");
    fprintf(stderr, "Peripheral FB: Run out of memory\n");
    exit(-1);
    exit(-1);
  }
  }
}
}
 
 
void fb_enabled(union param_val val, void *dat)
void fb_enabled(union param_val val, void *dat)
{
{
  struct fb_state *fb = dat;
  struct fb_state *fb = dat;
  fb->enabled = val.int_val;
  fb->enabled = val.int_val;
}
}
 
 
void *fb_sec_start(void)
void *fb_sec_start(void)
{
{
  struct fb_state *new = malloc(sizeof(struct fb_state));
  struct fb_state *new = malloc(sizeof(struct fb_state));
 
 
  if(!new) {
  if(!new) {
    fprintf(stderr, "Peripheral FB: Run out of memory\n");
    fprintf(stderr, "Peripheral FB: Run out of memory\n");
    exit(-1);
    exit(-1);
  }
  }
 
 
  new->baseaddr = 0;
  new->baseaddr = 0;
  new->ctrl = 0;
  new->ctrl = 0;
  new->pic = 0;
  new->pic = 0;
  new->in_refresh = 1;
  new->in_refresh = 1;
  new->refresh_count = 0;
  new->refresh_count = 0;
  new->addr = 0;
  new->addr = 0;
  new->cam_addr = 0;
  new->cam_addr = 0;
  new->camerax = 0;
  new->camerax = 0;
  new->cameray = 0;
  new->cameray = 0;
  new->camera_pos = 0;
  new->camera_pos = 0;
  new->enabled = 1;
  new->enabled = 1;
 
 
  return new;
  return new;
}
}
 
 
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)
{
{
  struct config_section *sec = reg_config_sec("fb", fb_sec_start, fb_sec_end);
  struct config_section *sec = reg_config_sec("fb", fb_sec_start, fb_sec_end);
 
 
  reg_config_param(sec, "baseaddr", paramt_addr, fb_baseaddr);
  reg_config_param(sec, "baseaddr", paramt_addr, fb_baseaddr);
  reg_config_param(sec, "enabled", paramt_int, fb_enabled);
  reg_config_param(sec, "enabled", paramt_int, fb_enabled);
  reg_config_param(sec, "refresh_rate", paramt_int, fb_refresh_rate);
  reg_config_param(sec, "refresh_rate", paramt_int, fb_refresh_rate);
  reg_config_param(sec, "filename", paramt_str, fb_filename);
  reg_config_param(sec, "filename", paramt_str, fb_filename);
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.