lcd.c

来自「ADS下的bios工程」· C语言 代码 · 共 552 行

C
552
字号
#include <asm/hardware.h>#include <bios/stdio.h>#include <bios/stdioint.h>#include <bios/config.h>#include <bios/types.h>#include <stdarg.h>#include "font-8x15.c"#include "logo.c"#include <linux/autoconf.h>#if defined(SAMSUNG_320x240_STN)#include <asm/arch/lcd.h>#elif defined(SAMSUNG_240x320_TFT)#include <bios/lcd.h>#endif#define DEBUG#undef DEBUG#ifdef DEBUG#define LCD_DEBUG(fmt, args...) Debug_print("%s-%s()[%d]: " fmt, __FILE__, __FUNCTION__, __LINE__,args)#else#define LCD_DEBUG(fmt, args...)#endif#define SET_RC(r, c) (fb->row = r, fb->col = c)#define INC_ROW (fb->row++)#define DEC_ROW (fb->row--)#define INC_COL (fb->col++)#define DEC_COL (fb->col--)#define SET_COL(c) (fb->col = c)#define SET_ROW(r) (fb->row = r)#if defined(SAMSUNG_320x240_STN)#define BK_GR	0x00000000	/* black *///#define BK_GR	0x88888888	/* middle gray */#define FR_GR	0xFFFFFFFF	/* white *///#define BK_GR	0x88888888	/* middle gray */#elif defined(SAMSUNG_240x320_TFT)#define BK_GR	0xFFFFFFFF	/* white *///#define BK_GR	0x03030303	/* blue */#define FR_GR	0x00000000	/* black *///#define FR_GR	0x03030303	/* blue */#endif#if defined(SAMSUNG_240x320_TFT)unsigned static int srpccon, srpdcon;void (*PutPixel)(u32,u32,u32);u32 (*frameBuffer16BitTft240320)[SCR_XSIZE_TFT_240320/2];#endifvoid lcd_init(void);extern void debug(unsigned char *);static FB *fb ;static struct font_header *fh ;static int flw ;extern FB SAis_Frame ;int do_kbd_init;int do_scroll;int lcd_printf(const char *fmt, ...);void LCDPutChar(unsigned char c) ;void do_logo(void);#if defined(SAMSUNG_320x240_STN) || defined(SAMSUNG_240x320_TFT)#define	convert(a)	(a)?FR_GR:BK_GR#endifvoid do_logo(void){	unsigned char *pixel, *buf;	int i, j, k;	lcd_init();	clrScreen();	setRC(1,5);	lcd_printf("vitals system\n\n");	pixel = &fb->pixel[0][0];	buf = logo;	for(i=0; i<(3*(fh->high)); i++)	{#if defined(SAMSUNG_320x240_STN)		for(j=0; j<8; j++)			for(k=0; k<4; k++)				fb->pixel[i][((26+k)*8)+j] = convert((logo[(i*4)+k]>>j) & 0x1);#elif defined(SAMSUNG_240x320_TFT)		for(j=0; j<8; j++)			for(k=0; k<4; k++) {				fb->pixel[i][((26+k)*8)+j] = convert((logo[(i*4)+k]>>j) & 0x1);			}#endif	}}void lcd_prints(char *buff, int nr){	int i;		for(i=0; i<nr; i++)		LCDPutChar(buff[i]);}int lcd_printf(const char *fmt, ...){	char buf[128];	va_list ap;	int len;	va_start(ap, fmt);	len = vsprintf(buf, fmt, ap);	va_end(ap);	lcd_prints(buf, len);	return len;}#if defined(SAMSUNG_320x240_STN)#define v_to_p(v_addr)  ((unsigned long)((*(unsigned long *)((RESET_DRAM_BASE+0x4000)+(v_addr>>18))) & 0xFFFFF000) + (v_addr & 0xFFFFF))#endifvoid lcd_init(void){#if defined(SAMSUNG_320x240_STN)	unsigned int x;	unsigned char *pixel;	unsigned int lcdbank, lcdbaseu, lcdbasel;#endif	fh = (struct font_header *) fontP;	flw = fh->wide * fh->count;			/* ??? */	while (flw % 4 != 0)		flw++;#if defined(SAMSUNG_320x240_STN)	/* At 12M in non-cached, unbuffered RAM, for now */	fb = (struct FrameBuffer *)LCD_FRAME_BUFFER;		/* virtual : 0xC1F00000 */		/* Special Register Base Address Setting */	x = (unsigned int)&fb->pixel[0][0];	x = v_to_p(x);	lcdbank = (unsigned int)x >> 22;	lcdbaseu = ((unsigned int)x & 0x3fffff) >> 1;	lcdbasel = (lcdbaseu + ((bPAGEWIDTH+bOFFSIZE) * FR_HEIGHT));	CSR_WRITE(LCDCON1, rLCDCON1);	CSR_WRITE(LCDCON2, rLCDCON2);	CSR_WRITE(LCDCON3, rLCDCON3);	CSR_WRITE(LCDCON4, rLCDCON4);	CSR_WRITE(LCDCON5, rLCDCON5);	CSR_WRITE(LCDSADDR1, ((lcdbank)<<21) | (lcdbaseu));	CSR_WRITE(LCDSADDR2, lcdbasel);	CSR_WRITE(LCDSADDR3, (bOFFSIZE<<11) | bPAGEWIDTH);	CSR_WRITE(REDLUT, 0xfdb96420);	CSR_WRITE(GREENLUT, 0xfdb96420);	CSR_WRITE(BLUELUT, 0xfb40);	/* IO Port Initialize */	CSR_WRITE(PDCON, ((CSR_READ(PDCON)&0x3FFCFF)|0x100));	/* GPD4 : output mode */	CSR_WRITE(PDDAT, CSR_READ(PDDAT) | 0x10);		/* DISP Enable */	CSR_WRITE(DITHMODE, 0x12210);	setRC(0,0);	pixel = &fb->pixel[0][0] ;	for (x = FR_HEIGHT * ((FR_WIDTH*BPP)/8); x > 0; x--)		*(pixel+x) = (unsigned char)BK_GR;#elif defined(SAMSUNG_240x320_TFT)	Lcd_Port_Init();	Lcd_Init(MODE_TFT_16BIT_240320);	Glib_Init(MODE_TFT_16BIT_240320);	LCD_DisplayControl(1);	{		int i;		int *temp=(int *)0xdf00000;		for(i=0; i<0x40000; i++)			*(temp+i) = BK_GR;	}	setRC(0,0);#endif}#if defined(SAMSUNG_240x320_TFT)void Lcd_Port_Init(void){    srpccon = CSR_READ(PCCON);    srpdcon = CSR_READ(PDCON);    CSR_WRITE(PCCON, 0xaaaaaaaa);   //VD[15:0] Initialization    CSR_WRITE(PDCON, (CSR_READ(PDCON) & 0xfffffc00));   //VCLK,VLINE,VM,VFRAME,LEND    CSR_WRITE(PDCON, (CSR_READ(PDCON) | 0x2aa));        //VCLK,VLINE,VM,VFRAME,LEND    CSR_WRITE(PDUP,  (CSR_READ(PDUP)  | 0x1f));}void Lcd_Init(int type){    switch(type) {    case MODE_TFT_16BIT_240320:        frameBuffer16BitTft240320=(u32 (*)[SCR_XSIZE_TFT_240320/2])LCD_FRAME_BUFFER;        (u32) fb = frameBuffer16BitTft240320;        CSR_WRITE(LCDCON1, ((CLKVAL_TFT_240320<<8)|(MVAL_USED<<7)|(0x3<<5)|(0xC<<1)|0));        CSR_WRITE(LCDCON2, ((VBPD_240320<<24)|(LINEVAL_TFT_240320<<14)|(VFPD_240320<<6)|(VSPW_240320)));        CSR_WRITE(LCDCON3, ((HBPD_240320<<19)|(HOZVAL_TFT_240320<<8)|(HFPD_240320)));        CSR_WRITE(LCDCON4, ((MVAL<<8)|(HSPW_240320)));        CSR_WRITE(LCDCON5, ((1<<9)|(1<<8)|(1<<1)));        CSR_WRITE(LCDSADDR1, ((((u32)0xdf00000>>22)<<21)|M5D((u32)0xdf00000>>1)));        CSR_WRITE(LCDSADDR2, (M5D( ((u32)0xdf00000+(240*320*2))>>1 )));        CSR_WRITE(LCDSADDR3, ((((240-240)/1)<<11)|(240/1)));        CSR_WRITE(TPAL, 0x0);        break;    default:        break;    }    LCD_DEBUG("LCDCON1   = [%x]\n", CSR_READ(LCDCON1));    LCD_DEBUG("LCDCON2   = [%x]\n", CSR_READ(LCDCON2));    LCD_DEBUG("LCDCON3   = [%x]\n", CSR_READ(LCDCON3));    LCD_DEBUG("LCDCON4   = [%x]\n", CSR_READ(LCDCON4));    LCD_DEBUG("LCDCON5   = [%x]\n", CSR_READ(LCDCON5));    LCD_DEBUG("LCDSADDR1 = [%x]\n", CSR_READ(LCDSADDR1));    LCD_DEBUG("LCDSADDR2 = [%x]\n", CSR_READ(LCDSADDR2));    LCD_DEBUG("LCDSADDR3 = [%x]\n", CSR_READ(LCDSADDR3));    LCD_DEBUG("TPAL   = [%x]\n", CSR_READ(TPAL));}void LCD_DisplayControl(int onoff){	// 1:LCD on  0:LCD off    if(onoff==1)    {        CSR_WRITE(LCDCON1, (CSR_READ(LCDCON1) | 1));    } else    {        CSR_WRITE(LCDCON1, (CSR_READ(LCDCON1) & 0x3fffe));    }    CSR_WRITE(PDDAT, ((CSR_READ(PDDAT)&(~(1<<9)))|(onoff<<9)));    CSR_WRITE(PDCON, ((CSR_READ(PDCON)&(~(3<<18)))|(1<<18)));}void Glib_Init(int type){        switch(type) {        case MODE_TFT_16BIT_240320:                        PutPixel=_PutTft16Bit_240320;                        break;        default:                        break;    }}void _PutTft16Bit_240320(u32 x,u32 y,u32 c){    if(x<SCR_XSIZE_TFT_240320 && y<SCR_YSIZE_TFT_240320)    {        frameBuffer16BitTft240320[(y)][(x)/2] = (frameBuffer16BitTft240320[(y)][x/2] & ~(0xffff0000>>((x)%2)*16) ) | ( (c&0x0000ffff)<<((2-1-((x)%2)        )*16));    }}#endif/* setting row / col in Frame Buffer */void setRC (int r, int c) {	fb->row=r, fb->col = c;}void incRC (int ir, int ic) {	fb->row += ir;	fb->col += ic;}void setRow (int r) {	fb->row = r;}void setCol (int c) {	fb->col = c;}int getCol () {	return fb->col;}int getRow () {	return fb->row;}/* * the following code sets up the LCD as terminal screen for the itsy screen * it uses a 16x9 fixed font so gets a 11 rows of 32 chars *//*  *  fast screen cleaner */void clrScreen(void){	int i, *p;    	/* get pointer to start of frame buffer */	p = (int *) fb->pixel;	/* clear all of buffer */	for (i = 0; i < ((((FR_WIDTH*BPP)/fh->wide) * FR_HEIGHT) / 4); i++)		*p++ = BK_GR;	do_scroll = 0;	fb->row = 0;	fb->col = 0;}/*  *  fast char row cleaner */void clrCharRow (int row){	int *p, i ;  	/* get pointer to start of row in frame buffer */	p = (int *) (&fb->pixel[0][0] + (row * (fh->high * ((FR_WIDTH*BPP)/fh->wide)))); 	/* clear a row of char in frame buffer */ 	for (i = ((((FR_WIDTH*BPP)/fh->wide) * fh->high) / 4); i > 0; i--)		*p++ = BK_GR;}void putcToFBrc (char c, unsigned int row, unsigned int col){	char *buf;	volatile unsigned char *pix;	int i;	/* check row/col in range */	/* FR_HEIGHT(240), fh->high(15), FR_WIDTH(320), fh->wide(8) */	if ((row > FR_HEIGHT / fh->high) || (col >= FR_WIDTH / fh->wide)) {		return ;	}	/* gen pointer into fb at upper left corner of char cell */	pix = &fb->pixel[(row * fh->high)][col*BPP];	buf = fontP + 6;	for (i = 0; i < fh->high; i++) {#if defined(SAMSUNG_320x240_STN)		int j;		for(j=0; j<8; j++)			*(pix+j) = (unsigned char)convert( (buf[i * fh->count+(c - fh->start)]>>j) & 0x1);#elif defined(SAMSUNG_240x320_TFT)		int j;		for(j=0; j<8; j++) {			*(pix+j) = (unsigned char)convert( (buf[i * fh->count+(c - fh->start)]>>j) & 0x1);		}#endif		pix += ((FR_WIDTH*BPP) / fh->wide);	}	return ;}void drawBox (int x1, int y1, int x2, int y2, int c)	/* ??? */{	unsigned char *pix;	/* Should I check out of range? */	pix = &fb->pixel[x1][y1];	/* ??? */}/* * position cursor */void setCursor (int row, int col)		/* ??? */{	unsigned char *pix;	/* check row/col in range */	if ((row > 10) || (col > 31)) {		return ;	}	/* gen pointer into fb at lower left corner of char cell */	pix = &fb->pixel[((row * 18) + 1 + 17)][col * 10];	*pix++ = 0x11;	*pix++ = 0x11;	*pix++ = 0x11;	*pix++ = 0x11;	*pix++ = 0x11;	fb->row = row;	fb->col = col;	return ;}/* * clear cursor */void clearCursor ()		/* ??? */{	return ;}/* * move cursor */int moveCursor (int r, int c)		/* ??? */{	unsigned char *pix;	/* check row/col in range */	if ((r > 10) || (c > 31)) {		return -1;	}	/* gen pointer into fb at lower left corner of current char cell */	pix = &fb->pixel[((r * 18) + 1 + 17)][c * 5];	*pix++ = 0x0;	*pix++ = 0x0;	*pix++ = 0x0;	*pix++ = 0x0;	*pix++ = 0x0;	/* gen pointer into fb at lower left corner of new char cell */	pix = &fb->pixel[((r * 18) + 1 + 17)][c * 5];	*pix++ = 0x11;	*pix++ = 0x11;	*pix++ = 0x11;	*pix++ = 0x11;	*pix++ = 0x11;	fb->row = r;	fb->col = c;	return (0);}/* * Fast scroll up one line */void scroll(void){	int *f, *t, size, j;	/* get pointer to start of row 1 in frame buffer */	f = (int *) (&fb->pixel[0][0]);	/* get pointer to start of row 0 in frame buffer */#if defined(SAMSUNG_320x240_STN)	t = (int *) (&fb->pixel[15][0]); #elif defined(SAMSUNG_240x320_TFT)	t = (int *) (&fb->pixel[20][0]);#endif	/* Get size of one row(word size) */	size = (fh->high * ((FR_WIDTH*BPP)/fh->wide))/4 ;	/* move all ten rows up one */	for(j=0; j<((FR_HEIGHT/fh->high)*size); j++) {		*f++ = *t++;	}	/* clear new row */	clrCharRow((FR_HEIGHT/fh->high) - 1);  }/* move curser point to next line */void new_line(void){	fb->row++;	fb->col=0;	if(fb->row == (FR_HEIGHT/fh->high)){		do_scroll = 1;#if defined(SAMSUNG_320x240_STN)		fb->row = 15;#elif defined(SAMSUNG_240x320_TFT)		fb->row = 20;#endif	}	if(do_scroll) {		scroll();	}	return;}void putcToFB (char c){	putcToFBrc(c, fb->row, fb->col);}void putcToFBi (char c) {	switch(c){		case '\n':		case '\r':			new_line();			break;		case '\t':		/* 0x09(tab) */			lcd_prints("     ", 5);			break;		case '\b':		case 0x7F:		/* DEL */			if(fb->col) {				fb->col--;				LCDPutChar(0x20);				fb->col--;			}			break;		case 0x0C:		/* CLEAR */			clrScreen();			break;		default:			putcToFBrc(c, fb->row, fb->col);			fb->col++;			if (fb->col >= (FR_WIDTH / fh->wide)) {				new_line();			}			break;	}}void putcToFBd (char c){	putcToFBrc(c, fb->row, fb->col);	if (fb->col > 0)		fb->col--;}void putsToFB (char *cp){	while (*cp != 0)		putcToFBi(*cp++);}extern int WriteSibFrame(int, int) ;void do_init_if_necessary(void){	if (do_kbd_init) {		do_kbd_init = 0;		lcd_init();		setRC(0,0);	}}void screen_phex(int ls) 		/* ??? */{	int i, v;	for (i = 8 ; i > 0 ; i--) {		v = (ls & 0xf0000000) >> 28;		if (v < 10)			LCDPutChar(v + 48);		else			LCDPutChar(v - 10 + 97);		ls = ls << 4;	}	LCDPutChar(10);}void LCDPutChar(unsigned char c) {	do_init_if_necessary();	putcToFBi(c);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?