]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/trab/vfd.c
* Patch by Josef Wagner, 12 Mar 2003:
[karo-tx-uboot.git] / board / trab / vfd.c
index fa1194ca7fbe6deb6fbe9e97378311a5cbcdbab9..894e3157d68bd702b89b02c0575aa0e7b884294d 100644 (file)
@@ -55,8 +55,8 @@
 #define BLAU   0x0C
 #define VIOLETT        0X0D
 
-ulong  vfdbase;
-ulong  frame_buf_size;
+/* MAGIC */
+#define        FRAME_BUF_SIZE  ((256*4*56)/8)
 #define frame_buf_offs 4
 
 /* Supported VFD Types */
@@ -76,19 +76,13 @@ void init_grid_ctrl(void)
        ulong adr, grid_cycle;
        unsigned int bit, display;
        unsigned char temp, bit_nr;
-       ulong val;
 
        /*
         * clear frame buffer (logical clear => set to "black")
         */
-       if (gd->vfd_inv_data == 0)
-               val = 0;
-       else
-               val = ~0;
-
-       for (adr = vfdbase; adr <= (vfdbase+7168); adr += 4) {
-               (*(volatile ulong*)(adr)) = val;
-       }
+       memset ((void *)(gd->fb_base),
+               gd->vfd_inv_data ? 0xFF : 0,
+               FRAME_BUF_SIZE);
 
        switch (gd->vfd_type) {
        case VFD_TYPE_T119C:
@@ -98,9 +92,9 @@ void init_grid_ctrl(void)
                             (grid_cycle + 200) * 4 +
                             frame_buf_offs + display;
                        /* wrap arround if offset (see manual S3C2400) */
-                       if (bit>=frame_buf_size*8)
-                               bit = bit - (frame_buf_size * 8);
-                       adr = vfdbase + (bit/32) * 4 + (3 - (bit%32) / 8);
+                       if (bit>=FRAME_BUF_SIZE*8)
+                               bit = bit - (FRAME_BUF_SIZE * 8);
+                       adr = gd->fb_base + (bit/32) * 4 + (3 - (bit%32) / 8);
                        bit_nr = bit % 8;
                        bit_nr = (bit_nr > 3) ? bit_nr-4 : bit_nr+4;
                        temp=(*(volatile unsigned char*)(adr));
@@ -115,9 +109,9 @@ void init_grid_ctrl(void)
                        else
                                bit = grid_cycle*256*4+200*4+frame_buf_offs+display-4;  /* grid nr. 0 */
                        /* wrap arround if offset (see manual S3C2400) */
-                       if (bit>=frame_buf_size*8)
-                               bit = bit-(frame_buf_size*8);
-                       adr = vfdbase+(bit/32)*4+(3-(bit%32)/8);
+                       if (bit>=FRAME_BUF_SIZE*8)
+                               bit = bit-(FRAME_BUF_SIZE*8);
+                       adr = gd->fb_base+(bit/32)*4+(3-(bit%32)/8);
                        bit_nr = bit%8;
                        bit_nr = (bit_nr>3)?bit_nr-4:bit_nr+4;
                        temp=(*(volatile unsigned char*)(adr));
@@ -136,9 +130,9 @@ void init_grid_ctrl(void)
                             (253 - grid_cycle) * 4 +
                             frame_buf_offs + display;
                        /* wrap arround if offset (see manual S3C2400) */
-                       if (bit>=frame_buf_size*8)
-                               bit = bit - (frame_buf_size * 8);
-                       adr = vfdbase + (bit/32) * 4 + (3 - (bit%32) / 8);
+                       if (bit>=FRAME_BUF_SIZE*8)
+                               bit = bit - (FRAME_BUF_SIZE * 8);
+                       adr = gd->fb_base + (bit/32) * 4 + (3 - (bit%32) / 8);
                        bit_nr = bit % 8;
                        bit_nr = (bit_nr > 3) ? bit_nr-4 : bit_nr+4;
                        temp=(*(volatile unsigned char*)(adr));
@@ -152,9 +146,9 @@ void init_grid_ctrl(void)
                                bit = grid_cycle*256*4+(252-grid_cycle)*4+frame_buf_offs+display;
 
                        /* wrap arround if offset (see manual S3C2400) */
-                       if (bit>=frame_buf_size*8)
-                               bit = bit-(frame_buf_size*8);
-                       adr = vfdbase+(bit/32)*4+(3-(bit%32)/8);
+                       if (bit>=FRAME_BUF_SIZE*8)
+                               bit = bit-(FRAME_BUF_SIZE*8);
+                       adr = gd->fb_base+(bit/32)*4+(3-(bit%32)/8);
                        bit_nr = bit%8;
                        bit_nr = (bit_nr>3)?bit_nr-4:bit_nr+4;
                        temp=(*(volatile unsigned char*)(adr));
@@ -254,7 +248,7 @@ void create_vfd_table(void)
                for(color=0;color<2;color++) {
                    for(display=0;display<4;display++) {
                        for(entry=0;entry<2;entry++) {
-                           unsigned long adr  = vfdbase;
+                           unsigned long adr  = gd->fb_base;
                            unsigned int bit_nr = 0;
                            
                            if (vfd_table[x][y][color][display][entry]) {
@@ -264,9 +258,9 @@ void create_vfd_table(void)
                                  * wrap arround if offset
                                  * (see manual S3C2400)
                                  */
-                               if (pixel>=frame_buf_size*8)
-                                       pixel = pixel-(frame_buf_size*8);
-                               adr    = vfdbase+(pixel/32)*4+(3-(pixel%32)/8);
+                               if (pixel>=FRAME_BUF_SIZE*8)
+                                       pixel = pixel-(FRAME_BUF_SIZE*8);
+                               adr    = gd->fb_base+(pixel/32)*4+(3-(pixel%32)/8);
                                bit_nr = pixel%8;
                                bit_nr = (bit_nr>3)?bit_nr-4:bit_nr+4;
                            }
@@ -375,7 +369,7 @@ int vfd_init_clocks(void)
        rPCCON =   (rPCCON & 0xFFFFFF00)| 0x000000AA;
        /* Port-Pins als LCD-Ausgang */
        rPDCON =   (rPDCON & 0xFFFFFF03)| 0x000000A8;
-#ifdef WITH_VFRAME
+#ifdef CFG_WITH_VFRAME
        /* mit VFRAME zum Messen */
        rPDCON =   (rPDCON & 0xFFFFFF00)| 0x000000AA;
 #endif
@@ -385,10 +379,18 @@ int vfd_init_clocks(void)
        rLCDCON4 = 0x00000001;
        rLCDCON5 = 0x00000440;
        rLCDCON1 = 0x00000B75;
+
+       return 0;
 }
 
 /*
  * initialize LCD-Controller of the S3C2400 for using VFDs
+ *
+ * VFD detection depends on the board revision:
+ * starting from Rev. 200 a type code can be read from the data pins,
+ * driven by some pull-up resistors; all earlier systems must be
+ * manually configured. The type is set in the "vfd_type" environment
+ * variable.
  */
 int drv_vfd_init(void)
 {
@@ -406,21 +408,15 @@ int drv_vfd_init(void)
        /* try to determine display type from the value
         * defined by pull-ups
         */
-       rPCUP  = (rPCUP | 0x000F);      /* activate  GPC0...GPC3 pullups */
+       rPCUP  = (rPCUP & 0xFFF0);      /* activate  GPC0...GPC3 pullups */
        rPCCON = (rPCCON & 0xFFFFFF00); /* configure GPC0...GPC3 as inputs */
+       udelay(10);                     /* allow signals to settle */
 
        vfd_id = (~rPCDAT) & 0x000F;    /* read GPC0...GPC3 port pins */
        debug("Detecting Revison of WA4-VFD: ID=0x%X\n", vfd_id);
 
        switch (vfd_id) {
-       case 0:                         /* board revision <= Rev.100 */
-/*-----*/
-               gd->vfd_inv_data = 0;
-               if (0)
-                       gd->vfd_type = VFD_TYPE_MN11236;
-               else
-                       gd->vfd_type = VFD_TYPE_T119C;
-/*-----*/
+       case 0:                 /* board revision < Rev.200 */
                if ((tmp = getenv ("vfd_type")) == NULL) {
                        break;
                }
@@ -435,7 +431,7 @@ int drv_vfd_init(void)
                gd->vfd_inv_data = 0;
 
                break;
-       default:                        /* default to MN11236, data inverted */
+       default:                /* default to MN11236, data inverted */
                gd->vfd_type = VFD_TYPE_MN11236;
                gd->vfd_inv_data = 1;
                setenv ("vfd_type", "MN11236");
@@ -446,7 +442,7 @@ int drv_vfd_init(void)
                "unknown",
                gd->vfd_inv_data ? ", inverted data" : "");
 
-       vfdbase = gd->fb_base;
+       gd->fb_base = gd->fb_base;
        create_vfd_table();
        init_grid_ctrl();
 
@@ -463,9 +459,9 @@ int drv_vfd_init(void)
         * see manual S3C2400
         */
        /* frame buffer startadr */
-       rLCDSADDR1 = vfdbase >> 1;
+       rLCDSADDR1 = gd->fb_base >> 1;
        /* frame buffer endadr */
-       rLCDSADDR2 = (vfdbase + frame_buf_size) >> 1;
+       rLCDSADDR2 = (gd->fb_base + FRAME_BUF_SIZE) >> 1;
        rLCDSADDR3 = ((256/4));
 
        debug ("LCDSADDR1: %lX\n", rLCDSADDR1);
@@ -489,11 +485,8 @@ ulong vfd_setmem (ulong addr)
 {
        ulong size;
 
-       /* MAGIC */
-       frame_buf_size = (256*4*56)/8;
-
        /* Round up to nearest full page */
-       size = (frame_buf_size + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
+       size = (FRAME_BUF_SIZE + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
 
        debug ("Reserving %ldk for VFD Framebuffer at: %08lx\n", size>>10, addr);