diff options
Diffstat (limited to 'c/src/lib/libcpu/arm/s3c2400/lcd/lcd.c')
-rw-r--r-- | c/src/lib/libcpu/arm/s3c2400/lcd/lcd.c | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/c/src/lib/libcpu/arm/s3c2400/lcd/lcd.c b/c/src/lib/libcpu/arm/s3c2400/lcd/lcd.c new file mode 100644 index 0000000000..749dec775f --- /dev/null +++ b/c/src/lib/libcpu/arm/s3c2400/lcd/lcd.c @@ -0,0 +1,156 @@ +#include <rtems.h> +#include <bsp.h> +#include <s3c2400.h> + +void gp32_setFramebuffer(void *add) { + uint32_t addr = (uint32_t) add; + uint32_t LCDBANK = addr >> 22; + uint32_t LCDBASEU = (addr & 0x3FFFFF) >> 1; + uint32_t LCDBASEL; + uint16_t OFFSIZE = 0; + uint16_t PAGEWIDTH; + uint16_t vidmode = ((rLCDCON1>>1) & 15)-8; + const uint8_t faktor[]= {15,30,60,120,240}; + + LCDBASEL = LCDBASEU + 320*faktor[vidmode]; + PAGEWIDTH = faktor[vidmode]; + + rLCDSADDR1 = (LCDBANK<<21) | (LCDBASEU<<0) ; + rLCDSADDR2 = (LCDBASEL<<0) ; + rLCDSADDR3 = (OFFSIZE<<11) | (PAGEWIDTH<<0) ; +} + +short gp32_initFramebufferN(void *add,uint32_t bitmode,uint32_t refreshrate) { + uint32_t addr = (uint32_t) add; + uint32_t GPHCLK = get_HCLK(); + { uint16_t BPPMODE = 12; + uint16_t CLKVAL = 3; + uint16_t ENVID = 1; + uint16_t MMODE = 0; + uint16_t PNRMODE = 3; + switch (bitmode) { + case 16 : BPPMODE=12; break; + case 8 : BPPMODE=11; break; + case 4 : BPPMODE=10; break; + case 2 : BPPMODE= 9; break; + case 1 : BPPMODE= 8; break; + default : BPPMODE= 12; break; + } + /* Get the correct CLKVAL for refreshrate + works in all bitmodes now :) + */ + if (refreshrate < 50) refreshrate = 50; + if (refreshrate > 120) refreshrate =120; + CLKVAL = (GPHCLK/(83385*2*refreshrate))-1; + if (CLKVAL == 0) CLKVAL=1; + refreshrate = GPHCLK / (83385*2*(CLKVAL+1)); + rLCDCON1 = (CLKVAL<<8) | (MMODE<<7) | (PNRMODE<<5) | (BPPMODE<<1) | (ENVID<<0) ; + } + { uint16_t LINEVAL = 320-1; + uint16_t VBPD = 1; + uint16_t VFPD = 2; + uint16_t VSPW = 1; + rLCDCON2 = 0; + rLCDCON2 = (VBPD<<24) | (LINEVAL<<14) | (VFPD<<6) | (VSPW<<0) ; + } + { uint16_t HBPD = 6; + uint16_t HFPD = 2; + uint16_t HOZVAL = 240-1; + rLCDCON3 = 0; + rLCDCON3 = (HBPD<<19) | (HOZVAL<<8) | (HFPD<<0) ; + } + { uint16_t ADDVAL = 0; + uint16_t HSPW = 4; + uint16_t MVAL = 0; + uint16_t PALADDEN = 0; + rLCDCON4 = 0; + rLCDCON4 = (PALADDEN<<24) | (ADDVAL<<16) | (MVAL<<8) | (HSPW<<0) ; + } + { uint16_t BSWP = 0; + uint16_t ENLEND = 0; + uint16_t HWSWP = 1; + uint16_t INVENDLINE = 0; + uint16_t INVVCLK = 1; + uint16_t INVVD = 0; + uint16_t INVVDEN = 0; + uint16_t INVVFRAME = 1; + uint16_t INVVLINE = 1; + if (bitmode<16) { BSWP=1;HWSWP=0; } + rLCDCON5 = 0; + rLCDCON5 = (INVVCLK<<10) | (INVVLINE<<9) | (INVVFRAME<<8) | (INVVD<<7) | (INVVDEN<<6) + | (INVENDLINE<<4) | (ENLEND<<2) | (BSWP<<1) | (HWSWP<<0) ; + } + gp32_setFramebuffer((uint32_t*)addr); + +return refreshrate; +} + +short gp32_initFramebufferBP(void *add,uint32_t bitmode,uint32_t refreshrate) { + uint32_t addr = (uint32_t) add; + uint32_t GPHCLK = get_HCLK(); + { uint16_t BPPMODE = 12; + uint16_t CLKVAL = 3; + uint16_t ENVID = 1; + uint16_t MMODE = 0; + uint16_t PNRMODE = 3; + switch (bitmode) { + case 16 : BPPMODE=12; break; + case 8 : BPPMODE=11; break; + case 4 : BPPMODE=10; break; + case 2 : BPPMODE= 9; break; + case 1 : BPPMODE= 8; break; + } + /* Get the correct CLKVAL for refreshrate + works in all bitmodes now :) + */ + if (refreshrate < 50) refreshrate = 50; + if (refreshrate > 120) refreshrate =120; + CLKVAL = (GPHCLK/(109850*2*refreshrate))-1; + if (CLKVAL == 0) CLKVAL=1; + refreshrate = GPHCLK / (109850*2*(CLKVAL+1)); + rLCDCON1 = (CLKVAL<<8) | (MMODE<<7) | (PNRMODE<<5) | (BPPMODE<<1) | (ENVID<<0); + } + { uint16_t LINEVAL = 320-1; + uint16_t VBPD = 8; + uint16_t VFPD = 2; + uint16_t VSPW = 5; + rLCDCON2 = 0; + rLCDCON2 = (VBPD<<24) | (LINEVAL<<14) | (VFPD<<6) | (VSPW<<0); + } + { uint16_t HBPD = 50; + uint16_t HFPD = 2; + uint16_t HOZVAL = 240-1; + rLCDCON3 = 0; + rLCDCON3 = (HBPD<<19) | (HOZVAL<<8) | (HFPD<<0); + } + { uint16_t ADDVAL = 0; + uint16_t HSPW = 30; + uint16_t MVAL = 0; + uint16_t PALADDEN = 0; + rLCDCON4 = 0; + rLCDCON4 = (PALADDEN<<24) | (ADDVAL<<16) | (MVAL<<8) | (HSPW<<0); + } + { uint16_t BSWP = 0; + uint16_t ENLEND = 0; + uint16_t HWSWP = 1; + uint16_t INVENDLINE = 0; + uint16_t INVVCLK = 1; + uint16_t INVVD = 0; + uint16_t INVVDEN = 0; + uint16_t INVVFRAME = 1; + uint16_t INVVLINE = 1; + if (bitmode<16) { BSWP=1;HWSWP=0; } + rLCDCON5 = 0; + rLCDCON5 = (INVVCLK<<10) | (INVVLINE<<9) | (INVVFRAME<<8) | (INVVD<<7) | (INVVDEN<<6) + | (INVENDLINE<<4) | (ENLEND<<2) | (BSWP<<1) | (HWSWP<<0); + } + gp32_setFramebuffer((uint32_t*)addr); + +return refreshrate; +} + +void gp32_setPalette( unsigned char pos, uint16_t color) { + unsigned long *palette=(unsigned long *)0x14A00400; + while ((rLCDCON5>>19) == 2); + palette[pos]=color; +} |