1
0
mirror of git://projects.qi-hardware.com/ben-blinkenlights.git synced 2025-04-21 12:27:27 +03:00

ubb-vga.c: moved line length and timing to variables

- ubb-vga.c (line_pairs, line, frame, tricolor, grid, session): line
  length is now kept in a variable, instead of hard-coding its value
  and the values derived from it
- ubb-vga.c (line_cycles, line, hdelay): the total line duration is now
  kept in a variable, instead of hard-coding it all over the place
This commit is contained in:
Werner Almesberger
2011-04-24 20:01:12 -03:00
parent dae21696b3
commit dab839ab66

View File

@@ -203,7 +203,7 @@ static void cleanup(void)
/* ----- Prefetch and delay logic ------------------------------------------ */ /* ----- Prefetch and delay logic ------------------------------------------ */
#define BURST 32 #define BURST 32 /* bytes */
static inline void prefetch(const uint8_t *prefetch, int words) static inline void prefetch(const uint8_t *prefetch, int words)
@@ -229,6 +229,10 @@ static void until(uint16_t cycles)
/* ----- Frame buffer output ----------------------------------------------- */ /* ----- Frame buffer output ----------------------------------------------- */
static int line_pairs = 160; /* set/unset pairs */
static int line_cycles = US(36); /* nominally 31.77 us, but we're too slow */
void setup(void) void setup(void)
{ {
mlockall(MCL_CURRENT | MCL_FUTURE); mlockall(MCL_CURRENT | MCL_FUTURE);
@@ -244,21 +248,20 @@ static void line(const uint8_t *line, const uint8_t *fetch)
/* HSYNC */ /* HSYNC */
*tcnt = 0; *tcnt = 0;
*pddatc = HSYNC; *pddatc = HSYNC;
prefetch(fetch, 160); prefetch(fetch, line_pairs);
until(US(3.77)); until(US(3.77));
*pddats = HSYNC; *pddats = HSYNC;
/* Front porch */ /* Front porch */
until(US(3.77+1.79)); until(US(3.77+1.79));
while (p != line+320) { while (p != line+2*line_pairs) {
*pddats = *p++ << 8; *pddats = *p++ << 8;
*pddatc = *p++ << 8; *pddatc = *p++ << 8;
} }
/* Back porch */ /* Back porch */
until(US(31.77)); until(line_cycles);
until(US(36));
} }
@@ -269,8 +272,7 @@ static void hdelay(int cycles)
*pddatc = HSYNC; *pddatc = HSYNC;
until(US(3.77)); until(US(3.77));
*pddats = HSYNC; *pddats = HSYNC;
until(US(31.77)); until(line_cycles);
until(US(36));
} }
} }
@@ -290,14 +292,13 @@ static void frame(const uint8_t *f)
until(US(3.77)); until(US(3.77));
*pddats = HSYNC; *pddats = HSYNC;
prefetch(f, 160); prefetch(f, line_pairs);
until(US(31.77)); until(line_cycles);
until(US(36));
hdelay(31); hdelay(31);
for (p = f; p != f+240*320; p += 320) { for (p = f; p != f+240*2*line_pairs; p += 2*line_pairs) {
line(p, p+160); line(p, p+line_pairs);
line(p, p+320); line(p, p+2*line_pairs);
} }
/* Back porch */ /* Back porch */
@@ -322,18 +323,19 @@ static uint32_t pattern(int set, int r, int g, int b)
static void tricolor(uint32_t *f) static void tricolor(uint32_t *f)
{ {
int pairs = 2*line_pairs*240;
int i; int i;
for (i = 0; i != 320*240/3; i++) { for (i = 0; i != pairs/3; i++) {
f[i & ~1] = R; f[i & ~1] = R;
f[i | 1] = G | B; f[i | 1] = G | B;
} }
for (; i != 320*240*2/3; i++) { for (; i != pairs*2/3; i++) {
f[i & ~1] = G; f[i & ~1] = G;
f[i | 1] = R | B; f[i | 1] = R | B;
} }
for (; i != 320*240; i++) { for (; i != pairs; i++) {
f[i & ~1] = B; f[i & ~1] = B;
f[i | 1] = R | G; f[i | 1] = R | G;
} }
@@ -355,9 +357,10 @@ static void grid(uint8_t *f)
int i, x, y; int i, x, y;
for (i = 0; i != 8; i++) { for (i = 0; i != 8; i++) {
x = i*40+20; x = i*line_pairs/4+line_pairs/8;
for (y = 0; y != 240; y++) { for (y = 0; y != 240; y++) {
f[y*320+x] = f[y*320+x+1] = col[i] >> 8; uint8_t *p = f+y*2*line_pairs+x;
p[0] = p[1] = col[i] >> 8;
} }
} }
} }
@@ -385,7 +388,7 @@ static void grab(uint8_t *f)
static void session(int frames) static void session(int frames)
{ {
uint8_t f[320*(240+1)]; uint8_t f[2*line_pairs*(240+1)];
int i; int i;
memset(f, 0, sizeof(f)); memset(f, 0, sizeof(f));