diff --git a/ubb-vga/ubb-vga2.c b/ubb-vga/ubb-vga2.c index 10b0e4b..93a85ca 100644 --- a/ubb-vga/ubb-vga2.c +++ b/ubb-vga/ubb-vga2.c @@ -267,12 +267,12 @@ static void line(const uint32_t *line, volatile const uint32_t *prefetch) *msc_strpcl = 1 << 3; /* reset the MSC */ // while (*msc_stat & (1 << 15)); - /* HSYNC */ *msc_txfifo = *p++; -// *msc_txfifo = *p++; until(US(0.79)); + /* HSYNC */ + *pddatc = HSYNC; *msc_strpcl = 2; /* start MMC clock output */ @@ -284,18 +284,28 @@ static void line(const uint32_t *line, volatile const uint32_t *prefetch) *msc_strpcl = 4; /* START_OP */ -#if 1 -// *msc_txfifo = *p++; -#else - for (p = line; p != line+1; p++) - for (p = line; p != line+1; p++) - *msc_txfifo = *p;//0xf0f0f0f0;//*p; -#endif - - until(US(0.79+3.77-0.2)); + until(US(0.79+3.77-0.3)); /* - * Without the -0.2, the XEN-1510 only detects the signal in only about - * 20% of all cases. + * Adjustment value tests with the XEN-1510: + * + * Adjustment Tries Good Jam FIFO jitter + * Quick load + * -0.0 10 3 7 0 n + * -0.1 10 5 5 0 n + * -0.2 10 6 4 0 n + * -0.3 10 7 3 0 n + * 10 5 5 0 y + * -0.4 10 1 0 9 n + * 10 5 0 5 n repeat + * 10 5 0 5 y + * -0.5 10 3 0 7 n + * 10 7 0 3 y + * -1.0 5 0 5 0 + * + * Good = image is stable + * Jam = does not detect the signal properly, loss of HSYNC, artefacts, + * or no image at all + * FIFO jitter = some lines get shifted by a "digital" amount */ /* Front porch */ @@ -303,32 +313,32 @@ static void line(const uint32_t *line, volatile const uint32_t *prefetch) *pdfuns = CMD; *pddats = HSYNC; *pdfunc = CMD; -// *msc_txfifo = *p++; -// for (; p != line+4; p++) -// *msc_txfifo = *p;//0xf0f0f0f0;//*p; -// until(US(0.79+3.77+1.79-0.1)); -// while (p != line+32) { //line_words) { + /* + * We don't wait for the end of the front porch because the beginning + * of pixel data is determined by the MSC. Instead, we make good use + * of the delay to shovel bits into the MSC's FIFO. + */ + +#if 0 /* quick load */ + *msc_txfifo = *p++; + *msc_txfifo = *p++; +#endif while (p != line+line_words) { uint8_t st; do { st = *msc_stat; if (st & 3) { - // printf("st 0x%04x\n", st); -bad++; -goto fail; - // return; + bad++; + goto fail; } } while (st & (1 << 7)); - *msc_txfifo = *p; - //*msc_txfifo = 0xf0f0f0f0; - p++; + *msc_txfifo = *p++; } fail: -//(void) *(volatile uint32_t *) (line+line_words); -(void) *prefetch; + (void) *prefetch; until(line_cycles); } @@ -356,16 +366,17 @@ static void frame(const uint32_t *f) /* Front porch */ -#if 0 - hdelay(32); -#else hdelay(31); - *tcnt = 0; - *pddatc = HSYNC; - until(US(3.77)); - *pddats = HSYNC; - until(line_cycles-US(0.79)); -#endif + + /* + * The horizontal back porch of the previous line is handled inside + * "line", so we have to wait for less than a full line here. + */ + *tcnt = 0; + *pddatc = HSYNC; + until(US(3.77)); + *pddats = HSYNC; + until(line_cycles-US(0.79)); for (p = f; p != f+240*line_words; p += line_words) { line(p, p);