videomixer: clear framebuffers
authorSebastien Bourdeauducq <sebastien@milkymist.org>
Fri, 15 Nov 2013 10:25:58 +0000 (11:25 +0100)
committerSebastien Bourdeauducq <sebastien@milkymist.org>
Fri, 15 Nov 2013 10:25:58 +0000 (11:25 +0100)
software/videomixer/dvisamplerX.c
software/videomixer/dvisamplerX.h
software/videomixer/processor.c

index 36dc669e07ada35fdd8ea100a737569549b518ee..49c71b1cc351d4ca2474afc2c7a207e2ebaab256 100644 (file)
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
 #include <irq.h>
 #include <uart.h>
@@ -26,6 +27,15 @@ void dvisamplerX_isr(void)
        int expected_length;
        unsigned int address_min, address_max;
 
+       address_min = (unsigned int)dvisamplerX_framebuffers & 0x0fffffff;
+       address_max = address_min + sizeof(dvisamplerX_framebuffers);
+       if((dvisamplerX_dma_slot0_status_read() == DVISAMPLER_SLOT_PENDING)
+               && ((dvisamplerX_dma_slot0_address_read() < address_min) || (dvisamplerX_dma_slot0_address_read() >= address_max)))
+               printf("dvisamplerX: slot0: stray DMA\n");
+       if((dvisamplerX_dma_slot1_status_read() == DVISAMPLER_SLOT_PENDING)
+               && ((dvisamplerX_dma_slot1_address_read() < address_min) || (dvisamplerX_dma_slot1_address_read() >= address_max)))
+               printf("dvisamplerX: slot1: stray DMA\n");
+
        if((dvisamplerX_resdetection_hres_read() != dvisamplerX_hres)
          || (dvisamplerX_resdetection_vres_read() != dvisamplerX_vres)) {
                /* Dump frames until we get the expected resolution */
@@ -40,15 +50,6 @@ void dvisamplerX_isr(void)
                return;
        }
 
-       address_min = (unsigned int)dvisamplerX_framebuffers & 0x0fffffff;
-       address_max = address_min + sizeof(dvisamplerX_framebuffers);
-       if((dvisamplerX_dma_slot0_status_read() == DVISAMPLER_SLOT_PENDING)
-               && ((dvisamplerX_dma_slot0_address_read() < address_min) || (dvisamplerX_dma_slot0_address_read() >= address_max)))
-               printf("dvisamplerX: stray DMA on slot 0\n");
-       if((dvisamplerX_dma_slot1_status_read() == DVISAMPLER_SLOT_PENDING)
-               && ((dvisamplerX_dma_slot1_address_read() < address_min) || (dvisamplerX_dma_slot1_address_read() >= address_max)))
-               printf("dvisamplerX: stray DMA on slot 1\n");
-
        expected_length = dvisamplerX_hres*dvisamplerX_vres*4;
        if(dvisamplerX_dma_slot0_status_read() == DVISAMPLER_SLOT_PENDING) {
                length = dvisamplerX_dma_slot0_address_read() - ((unsigned int)dvisamplerX_framebuffers[dvisamplerX_fb_slot_indexes[0]] & 0x0fffffff);
@@ -88,13 +89,6 @@ void dvisamplerX_init_video(int hres, int vres)
        dvisamplerX_connected = dvisamplerX_locked = 0;
        dvisamplerX_hres = hres; dvisamplerX_vres = vres;
 
-       mask = irq_getmask();
-       mask &= ~(1 << DVISAMPLERX_INTERRUPT);
-       irq_setmask(mask);
-
-       dvisamplerX_dma_slot0_status_write(DVISAMPLER_SLOT_EMPTY);
-       dvisamplerX_dma_slot1_status_write(DVISAMPLER_SLOT_EMPTY);
-
        dvisamplerX_dma_frame_size_write(hres*vres*4);
        dvisamplerX_fb_slot_indexes[0] = 0;
        dvisamplerX_dma_slot0_address_write((unsigned int)dvisamplerX_framebuffers[0]);
@@ -106,12 +100,31 @@ void dvisamplerX_init_video(int hres, int vres)
 
        dvisamplerX_dma_ev_pending_write(dvisamplerX_dma_ev_pending_read());
        dvisamplerX_dma_ev_enable_write(0x3);
+       mask = irq_getmask();
        mask |= 1 << DVISAMPLERX_INTERRUPT;
        irq_setmask(mask);
 
        fb_dmaX_base_write((unsigned int)dvisamplerX_framebuffers[3]);
 }
 
+void dvisamplerX_disable(void)
+{
+       unsigned int mask;
+
+       mask = irq_getmask();
+       mask &= ~(1 << DVISAMPLERX_INTERRUPT);
+       irq_setmask(mask);
+
+       dvisamplerX_dma_slot0_status_write(DVISAMPLER_SLOT_EMPTY);
+       dvisamplerX_dma_slot1_status_write(DVISAMPLER_SLOT_EMPTY);
+}
+
+void dvisamplerX_clear_framebuffers(void)
+{
+       memset(&dvisamplerX_framebuffers, 0, sizeof(dvisamplerX_framebuffers));
+       // TODO: empty bridge cache
+}
+
 static int dvisamplerX_d0, dvisamplerX_d1, dvisamplerX_d2;
 
 void dvisamplerX_print_status(void)
@@ -310,6 +323,7 @@ void dvisamplerX_service(void)
                        dvisamplerX_connected = 0;
                        dvisamplerX_locked = 0;
                        dvisamplerX_clocking_pll_reset_write(1);
+                       dvisamplerX_clear_framebuffers();
                } else {
                        if(dvisamplerX_locked) {
                                if(dvisamplerX_clocking_locked_filtered()) {
@@ -322,6 +336,7 @@ void dvisamplerX_service(void)
                                        if(dvisamplerX_debug)
                                                printf("dvisamplerX: lost PLL lock\n");
                                        dvisamplerX_locked = 0;
+                                       dvisamplerX_clear_framebuffers();
                                }
                        } else {
                                if(dvisamplerX_clocking_locked_filtered()) {
index 258305bd6064b13dc6ce8e831381a12ba440fe02..13422dce4ed170d8d062d046a179827358b38dfd 100644 (file)
@@ -5,6 +5,8 @@ extern int dvisamplerX_debug;
 
 void dvisamplerX_isr(void);
 void dvisamplerX_init_video(int hres, int vres);
+void dvisamplerX_disable(void);
+void dvisamplerX_clear_framebuffers(void);
 void dvisamplerX_print_status(void);
 int dvisamplerX_calibrate_delays(void);
 int dvisamplerX_adjust_phase(void);
index 3378c9023e6115e2f49ac1f98e36aee460470386..972d22fe8262e35ef7a27f7033a2e48c461293ea 100644 (file)
@@ -172,6 +172,11 @@ void processor_start(int mode)
        dvisampler0_edid_hpd_en_write(0);
        dvisampler1_edid_hpd_en_write(0);
 
+       dvisampler0_disable();
+       dvisampler1_disable();
+       dvisampler0_clear_framebuffers();
+       dvisampler1_clear_framebuffers();
+
        fb_set_mode(m);
        edid_set_mode(m);
        dvisampler0_init_video(m->h_active, m->v_active);