mirror of
git://projects.qi-hardware.com/ben-blinkenlights.git
synced 2024-11-24 02:35:54 +02:00
ubb-vga: express mode data in more common units and remove hard-coded constants
- ubb-vga.h (struct mode), ubb-vga.c (mode_db): replaced hsync_end with its constituends hsync_cycles and hback_cycles - ubb-vga.h (struct mode), ubb-vga.c (mode_db): added vsync_lines, vfront_lines, and vback_lines - ubb-vga.h (struct mode): changed "line_cycles" from "int" to "uint16_t" - ubb-vga.c (line): don't hard-code horizontal back porch - ubb-vga.c (line): don't hard-code sum of horizontal back porch and hsync - ubb-vga.c (hdelay): don't hard-code hsync - ubb-vga.c (frame): don't hard-code vsync and the vertical porches - ubb-vga.c (frame): don't hard-code hsync and horizontal back porch
This commit is contained in:
parent
aa2fc7101d
commit
4b59dbf062
@ -49,16 +49,19 @@ static int bad;
|
|||||||
|
|
||||||
|
|
||||||
static const struct mode mode_db[] = {
|
static const struct mode mode_db[] = {
|
||||||
{ "640x480", 640, 480, 11, US(29.7), US(0.79+3.77-0.3) },
|
/* name xres yres clkdiv vfront hsync hback htotal */
|
||||||
{ "800x600", 800, 600, 8, US(28.7), US(2.0+3.3+0.3) },
|
/* vsync vback */
|
||||||
/* the next one may work after adjusting the timing in "frame" */
|
{ "640x480", 640, 480, 11, 2, 32, 14, US(3.47), US(0.79), US(29.7) },
|
||||||
{ "800x600", 800, 600, 8, US(28.2), US(2.0+3.3+0.3-0.3) },
|
{ "800x600", 800, 600, 8, 2, 32, 14, US(4.81), US(0.79), US(28.7) },
|
||||||
/* the 1024x768 below is not great but has good parameter tolerance */
|
/* the next one may work after adjusting the timing in "frame" */
|
||||||
{ "1024x768", 1024, 768, 8, US(36.0), US(2.0+3.3) },
|
{ "800x600", 800, 600, 8, 2, 32, 14, US(4.51), US(0.79), US(28.2) },
|
||||||
/* illustrate underruns */
|
|
||||||
{ "1024x768ur", 1024, 768, 7, US(33.5), US(0.4+2.1+0.5) },
|
/* the 1024x768 below is not great but has good parameter tolerance */
|
||||||
{ "1024x768/53", 1024, 768, 5, US(23.1), US(0.4+2.1-0.4) },
|
{ "1024x768", 1024, 768, 8, 2, 32, 14, US(4.51), US(0.79), US(36.0) },
|
||||||
{ NULL }
|
/* illustrate underruns */
|
||||||
|
{ "1024x768ur", 1024, 768, 7, 2, 32, 14, US(2.21), US(0.79), US(33.5) },
|
||||||
|
{ "1024x768/53",1024, 768, 5, 2, 32, 14, US(1.31), US(0.79), US(23.1) },
|
||||||
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -274,7 +277,7 @@ static void line(unsigned long line)
|
|||||||
DTA(DMA) = REG_PADDR(MSC_TXFIFO); /* MUST set this each time */
|
DTA(DMA) = REG_PADDR(MSC_TXFIFO); /* MUST set this each time */
|
||||||
DTC(DMA) = mode->xres >> 6;
|
DTC(DMA) = mode->xres >> 6;
|
||||||
|
|
||||||
until(US(0.79));
|
until(mode->hback_cycles);
|
||||||
|
|
||||||
/* HSYNC */
|
/* HSYNC */
|
||||||
|
|
||||||
@ -295,7 +298,7 @@ static void line(unsigned long line)
|
|||||||
(1 << 31) | /* no descriptor */
|
(1 << 31) | /* no descriptor */
|
||||||
1;
|
1;
|
||||||
|
|
||||||
until(mode->hsync_end);
|
until(mode->hback_cycles+mode->hsync_cycles);
|
||||||
|
|
||||||
// MSC_TXFIFO = 0xffffffff;
|
// MSC_TXFIFO = 0xffffffff;
|
||||||
|
|
||||||
@ -316,7 +319,7 @@ static void hdelay(int cycles)
|
|||||||
while (cycles--) {
|
while (cycles--) {
|
||||||
TCNT(TIMER) = 0;
|
TCNT(TIMER) = 0;
|
||||||
PDDATC = HSYNC;
|
PDDATC = HSYNC;
|
||||||
until(US(3.77));
|
until(mode->hsync_cycles);
|
||||||
PDDATS = HSYNC;
|
PDDATS = HSYNC;
|
||||||
until(mode->line_cycles);
|
until(mode->line_cycles);
|
||||||
}
|
}
|
||||||
@ -329,12 +332,12 @@ static void frame(const unsigned long *f)
|
|||||||
|
|
||||||
/* VSYNC */
|
/* VSYNC */
|
||||||
PDDATC = VSYNC;
|
PDDATC = VSYNC;
|
||||||
hdelay(2);
|
hdelay(mode->vsync_lines);
|
||||||
PDDATS = VSYNC;
|
PDDATS = VSYNC;
|
||||||
|
|
||||||
/* Front porch */
|
/* Front porch */
|
||||||
|
|
||||||
hdelay(31);
|
hdelay(mode->vfront_lines-1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The horizontal back porch of the previous line is handled inside
|
* The horizontal back porch of the previous line is handled inside
|
||||||
@ -342,9 +345,9 @@ static void frame(const unsigned long *f)
|
|||||||
*/
|
*/
|
||||||
TCNT(TIMER) = 0;
|
TCNT(TIMER) = 0;
|
||||||
PDDATC = HSYNC;
|
PDDATC = HSYNC;
|
||||||
until(US(3.77));
|
until(mode->hsync_cycles);
|
||||||
PDDATS = HSYNC;
|
PDDATS = HSYNC;
|
||||||
until(mode->line_cycles-US(0.79));
|
until(mode->line_cycles-mode->hback_cycles);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note: resetting the timer just before calling "line" isn't enough.
|
* Note: resetting the timer just before calling "line" isn't enough.
|
||||||
@ -358,7 +361,7 @@ static void frame(const unsigned long *f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Back porch */
|
/* Back porch */
|
||||||
hdelay(14);
|
hdelay(mode->vback_lines);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -448,6 +451,14 @@ int main(int argc, char *const *argv)
|
|||||||
usage(*argv);
|
usage(*argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#define CYCLES(cy) ((cy)/112.0+0.5)
|
||||||
|
|
||||||
|
printf("V: %d+%d+%d+%d\n", mode->vsync_lines, mode->vfront_lines,
|
||||||
|
mode->yres, mode->vback_lines);
|
||||||
|
printf("H: %4.1f+?+?+%4.1f (%4.1f)\n", CYCLES(mode->hsync_cycles),
|
||||||
|
CYCLES(mode->hback_cycles), CYCLES(mode->line_cycles));
|
||||||
|
#endif
|
||||||
setup();
|
setup();
|
||||||
session(gen, frames);
|
session(gen, frames);
|
||||||
cleanup();
|
cleanup();
|
||||||
|
@ -27,8 +27,12 @@ struct mode {
|
|||||||
const char *name; /* NULL for end of table */
|
const char *name; /* NULL for end of table */
|
||||||
int xres, yres;
|
int xres, yres;
|
||||||
int clkdiv; /* pixel clock = 336 MHz/(clkdiv+1) */
|
int clkdiv; /* pixel clock = 336 MHz/(clkdiv+1) */
|
||||||
int line_cycles; /* 31.77 us for official VGA */
|
int vsync_lines; /* 2 lines, for official VGA */
|
||||||
int hsync_end; /* 0.79+3.77 us for official VGA */
|
int vfront_lines; /* 32 lines */
|
||||||
|
int vback_lines; /* 14 lines */
|
||||||
|
uint16_t hsync_cycles; /* 3.77 us */
|
||||||
|
uint16_t hback_cycles; /* 0.79 us */
|
||||||
|
uint16_t line_cycles; /* 31.77 us */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const struct mode *mode;
|
extern const struct mode *mode;
|
||||||
|
Loading…
Reference in New Issue
Block a user