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

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_49/] [or1ksim/] [peripheral/] [fb.c] - Diff between revs 846 and 859

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 846 Rev 859
Line 29... Line 29...
static int fb_ctrl = 0;
static int fb_ctrl = 0;
static int fb_pic = 0;
static int fb_pic = 0;
static int fb_in_refresh = 1;
static int fb_in_refresh = 1;
static int fb_refresh_count = 0;
static int fb_refresh_count = 0;
static unsigned long fb_addr = 0;
static unsigned long fb_addr = 0;
 
static unsigned long cam_addr = 0;
 
static int camerax = 0, cameray = 0, camera_pos = 0;
 
 
static void change_buf_addr (unsigned long addr)
static void change_buf_addr (unsigned long addr)
{
{
  fb_addr = addr;
  fb_addr = addr;
}
}
Line 42... Line 44...
{
{
  int a = (addr - config.fb.baseaddr);
  int a = (addr - config.fb.baseaddr);
  switch (a) {
  switch (a) {
    case FB_CTRL:    fb_ctrl = value; break;
    case FB_CTRL:    fb_ctrl = value; break;
    case FB_BUFADDR: change_buf_addr (value); break;
    case FB_BUFADDR: change_buf_addr (value); break;
 
    case FB_CAMBUFADDR: cam_addr = value; break;
 
    case FB_CAMPOSADDR: camera_pos = value;
 
                     camerax = value % FB_SIZEX;
 
                     cameray = value / FB_SIZEX;
 
                     break;
    default:
    default:
      a -= FB_PAL;
      a -= FB_PAL;
      a /= 4;
      a /= 4;
      if (a < 0 || a >= 256) {
      if (a < 0 || a >= 256) {
        fprintf (stderr, "Write out of palette buffer (0x%08x)!\n", addr);
        fprintf (stderr, "Write out of palette buffer (0x%08x)!\n", addr);
Line 62... Line 69...
  switch (a) {
  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 cam_addr; break;
 
    case FB_CAMPOSADDR: return camera_pos; break;
    default:
    default:
      a -= FB_PAL;
      a -= FB_PAL;
      a /= 4;
      a /= 4;
      if (a < 0 || a >= 256) {
      if (a < 0 || a >= 256) {
        fprintf (stderr, "Read out of palette buffer (0x%08x)!\n", addr);
        fprintf (stderr, "Read out of palette buffer (0x%08x)!\n", addr);
Line 74... Line 83...
      } else return pal[a];
      } else return pal[a];
  }
  }
}
}
 
 
/* define these also for big endian */
/* define these also for big endian */
 
#if __BIG_ENDIAN__
 
#define CNV32(x) (x) (\
 
     ((((x) >> 24) & 0xff) << 0)\
 
   | ((((x) >> 16) & 0xff) << 8)\
 
   | ((((x) >> 8) & 0xff) << 16)\
 
   | ((((x) >> 0) & 0xff) << 24))
 
#define CNV16(x) (x) (\
 
   | ((((x) >> 8) & 0xff) << 0)\
 
   | ((((x) >> 0) & 0xff) << 8))
 
#else
#define CNV16(x) (x)
#define CNV16(x) (x)
#define CNV32(x) (x)
#define CNV32(x) (x)
 
#endif
 
 
/* Dumps a bmp file, based on current image */
/* Dumps a bmp file, based on current image */
static int fb_dump_image (char *filename)
static int fb_dump_image8 (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;
Line 113... Line 133...
  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(0);  /* 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(0);  /* 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;
Line 154... Line 174...
  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 */
 
static int fb_dump_image24 (char *filename)
 
{
 
  int sx = FB_SIZEX;
 
  int sy = FB_SIZEY;
 
  int i, x, y;
 
  FILE *fo;
 
 
 
  unsigned short int u16;
 
  unsigned long int u32;
 
 
 
  if (config.sim.verbose) printf ("Creating %s...", filename);
 
  fo = fopen (filename, "wb+");
 
  u16 = CNV16(19778); /* BM */
 
  if (!fwrite (&u16, 2, 1, fo)) return 1;
 
  u32 = CNV32(14 + 40 + sx * sy * 3); /* size */
 
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
  u32 = CNV32(0); /* reserved */
 
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
  u32 = 14 + 40; /* offset */
 
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
 
 
  u32 = CNV32(40); /* header size */
 
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
  u32 = CNV32(sx); /* width */
 
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
  u32 = CNV32(sy); /* height */
 
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
  u16 = CNV16(1);  /* planes */
 
  if (!fwrite (&u16, 2, 1, fo)) return 1;
 
  u16 = CNV16(24);  /* bits */
 
  if (!fwrite (&u16, 2, 1, fo)) return 1;
 
  u32 = CNV32(0);  /* compression */
 
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
  u32 = CNV32(x * y * 3); /* image size */
 
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
  u32 = CNV32(2835);  /* x resolution */
 
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
  u32 = CNV32(2835);  /* y resolution */
 
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
  u32 = CNV32(0);  /* ncolours = 0; should be generated */
 
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
  u32 = CNV32(0);  /* important colours; all are important */
 
  if (!fwrite (&u32, 4, 1, fo)) return 1;
 
 
 
  if (config.sim.verbose) printf ("(%i,%i)", sx, sy);
 
  /* Data is stored upside down */
 
  for (y = sy - 1; y >= 0; y--) {
 
    unsigned char line[FB_SIZEX][3];
 
    for (x = 0; x < sx; x++)
 
      if (y >= cameray && x >= camerax && y < cameray + CAM_SIZEY && x < camerax + CAM_SIZEX) {
 
        int add = cam_addr + (x - camerax + (y - cameray) * CAM_SIZEX) * 2;
 
        unsigned short d = evalsim_mem16 (add);
 
        line[x][0] = ((d >> 0) & 0x1f) << 3;  /* Blue */
 
        line[x][1] = ((d >> 5) & 0x3f) << 2;  /* Green */
 
        line[x][2] = ((d >> 11) & 0x1f) << 3; /* Red */
 
      } else {
 
        int add = (fb_addr & ~(FB_WRAP - 1)) | ((fb_addr + y * sx + x) & (FB_WRAP - 1));
 
        unsigned short d = pal[evalsim_mem8 (add)];
 
        line[x][0] = ((d >> 0) & 0x1f) << 3;  /* Blue */
 
        line[x][1] = ((d >> 5) & 0x3f) << 2;  /* Green */
 
        line[x][2] = ((d >> 11) & 0x1f) << 3; /* Red */
 
      }
 
    if(!fwrite (line, sizeof(line), 1, fo)) return 1;
 
  }
 
 
 
  if (config.sim.verbose) printf ("DONE\n");
 
  fclose (fo);
 
  return 0;
 
}
 
 
void fb_job (int param)
void fb_job (int param)
{
{
  if (param) {
  if (param) {
    /* dump the image? */
    /* dump the image? */
    if (fb_ctrl) {
    if (fb_ctrl & 1) {
      char temp[STR_SIZE];
      char temp[STR_SIZE];
      sprintf (temp, "%s%04i.bmp", &config.fb.filename[0], fb_pic);
      sprintf (temp, "%s%04i.bmp", &config.fb.filename[0], fb_pic);
      fb_dump_image (temp);
      if (fb_ctrl & 2) fb_dump_image24 (temp);
 
      else fb_dump_image8 (temp);
      fb_pic++;
      fb_pic++;
    }
    }
    SCHED_ADD(fb_job, 0, cycles + config.fb.refresh_rate - config.fb.refresh_rate / REFRESH_DIVIDER);
    SCHED_ADD(fb_job, 0, cycles + config.fb.refresh_rate - config.fb.refresh_rate / REFRESH_DIVIDER);
    fb_in_refresh = 0;
    fb_in_refresh = 0;
  } else {
  } else {

powered by: WebSVN 2.1.0

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