s3c2410fb.c

来自「SMDK2440 boot code, base on vivi」· C语言 代码 · 共 129 行

C
129
字号
#include <config.h>#include <machine.h>#include <vmalloc.h>#include <vstring.h>#include <fb_core.h>#include "s3c2410fb.h"#ifdef CONFIG_S3C2410_MPORT3static struct vivi_fb s3c2410_fb = {	bpp : 16,	xres : 320,	yres : 96,	mem : NULL,};static struct s3c2410fb_lcd_info lcd_info = {	lcdcon1 : LCD1_BPP_16T | LCD1_PNR_TFT | LCD1_CLKVAL(7),	lcdcon2 : LCD2_VBPD(76-1) | LCD2_VFPD(78-1) | LCD2_VSPW(1-1),	lcdcon3 : LCD3_HBPD(72-12-1) | LCD3_HFPD(8+1-1), // +1 : h/w bug ?	lcdcon4 : LCD4_HSPW(12-1),	lcdcon5 : LCD5_FRM565 | LCD5_HWSWP,};#elif defined(CONFIG_S3C2440_SMDK2440)static struct vivi_fb s3c2410_fb = {	bpp : 16,	xres : 240,	yres : 320,	mem : NULL,};static struct s3c2410fb_lcd_info lcd_info = {	lcdcon1 : LCD1_CLKVAL(12/*7*/) | (0<<7) | LCD1_PNR_TFT | LCD1_BPP_16T | (0<<0),	lcdcon2 : LCD2_VBPD(1) | LCD2_VFPD(2) | LCD2_VSPW(1),	lcdcon3 : LCD3_HBPD(6) | LCD3_HFPD(2),	lcdcon4 : LCD4_MVAL(13) | LCD4_HSPW(4),	lcdcon5 : LCD5_FRM565 | LCD5_INVVLINE | LCD5_INVVFRAME | LCD5_PWREN | LCD5_HWSWP,};#endifstatic unsigned char *s3c2410_fbmem = NULL;static void s3c2410_lcd_init(void){	GPDCON = 0xaaaaaaaa;#ifdef CONFIG_S3C2440_SMDK2440	GPCCON = 0xaaaaaaaa;	set_gpio_ctrl(GPIO_G4 | GPIO_PULLUP_EN | GPIO_MODE_LCD_PWRDN);#endif#ifdef CONFIG_S3C2410_MPORT3//                                       7 6  5 4    3 2  1 0//  1010 1010   1010 1010   1010 1010   0000 0010   1010 1000//	GPCCON = 0xaaaa02a8; // KEY-REMOCON(0), MID(5), EMP(6), null(7)	set_gpio_ctrl(GPIO_VD7 | GPIO_PULLUP_EN | GPIO_MODE_VD);	set_gpio_ctrl(GPIO_VD6 | GPIO_PULLUP_EN | GPIO_MODE_VD);	set_gpio_ctrl(GPIO_VD5 | GPIO_PULLUP_EN | GPIO_MODE_VD);	set_gpio_ctrl(GPIO_VD4 | GPIO_PULLUP_EN | GPIO_MODE_VD);	set_gpio_ctrl(GPIO_VD3 | GPIO_PULLUP_EN | GPIO_MODE_VD);	set_gpio_ctrl(GPIO_VD2 | GPIO_PULLUP_EN | GPIO_MODE_VD);	set_gpio_ctrl(GPIO_VD1 | GPIO_PULLUP_EN | GPIO_MODE_VD);	set_gpio_ctrl(GPIO_VD0 | GPIO_PULLUP_EN | GPIO_MODE_VD);//	set_gpio_ctrl(GPIO_VDEN | GPIO_PULLUP_EN | GPIO_MODE_VM); /* not used */	set_gpio_ctrl(GPIO_VSYNC | GPIO_PULLUP_EN | GPIO_MODE_VFRAME);	set_gpio_ctrl(GPIO_HSYNC | GPIO_PULLUP_EN | GPIO_MODE_VLINE);	set_gpio_ctrl(GPIO_VCLK | GPIO_PULLUP_EN | GPIO_MODE_VCLK);	/* lcd power on */	set_gpio_ctrl(GPIO_LCD_PWREN | GPIO_MODE_OUT | GPIO_PULLUP_EN);	write_gpio_bit(GPIO_LCD_PWREN, 1);#endif /* CONFIG_S3C2410_MPORT3 */}void s3c2410fb_init(struct vivi_fb **fb){	unsigned long s3c2410_fbmem_addr = 0xffffffff;	int i;	*fb = &s3c2410_fb;	s3c2410_fbmem = vmalloc((*fb)->xres * (*fb)->yres * (((*fb)->bpp+7) / 8));	s3c2410_fbmem_addr = (unsigned long)s3c2410_fbmem;	if (!s3c2410_fbmem) {		printk("Cannot allocate FB memory\n");		*fb = NULL;		return;		}	s3c2410_lcd_init();	lcd_info.lcdcon1 = lcd_info.lcdcon1 & ~LCD1_ENVID;	lcd_info.lcdcon2 = (lcd_info.lcdcon2 & ~LCD2_LINEVAL_MSK) | LCD2_LINEVAL((*fb)->yres - 1);	/* TFT LCD only ! */	lcd_info.lcdcon3 = (lcd_info.lcdcon3 & ~LCD3_HOZVAL_MSK) | LCD3_HOZVAL((*fb)->xres - 1);	lcd_info.lcdsaddr1 = LCDADDR_BANK((s3c2410_fbmem_addr >> 22))		| LCDADDR_BASEU((s3c2410_fbmem_addr >> 1));	/* 16bpp */	lcd_info.lcdsaddr2 = LCDADDR_BASEL((s3c2410_fbmem_addr + ((*fb)->xres * 2 * ((*fb)->yres/*-1*/)))	>> 1);	lcd_info.lcdsaddr3 = LCDADDR_OFFSET(0) | (LCDADDR_PAGE((*fb)->xres) /*>> 1*/);	LCDCON1 = lcd_info.lcdcon1;	LCDCON2 = lcd_info.lcdcon2;	LCDCON3 = lcd_info.lcdcon3;	LCDCON4 = lcd_info.lcdcon4;	LCDCON5 = lcd_info.lcdcon5;	LCDADDR1 = lcd_info.lcdsaddr1;	LCDADDR2 = lcd_info.lcdsaddr2;	LCDADDR3 = lcd_info.lcdsaddr3;	LCDCON1 |= LCD1_ENVID;#ifdef CONFIG_S3C2440_SMDK2440	LCDLPCSEL &= ~0x7;	LCDLPCSEL |= (0x1<<4);#endif	TPAL = 0;	/* LCD clear/display */	while(i < ((*fb)->xres * (*fb)->yres) * 2)	{		s3c2410_fbmem[i++] = (((31)<<11)|((63)<<5)|(0));	}	(*fb)->mem = s3c2410_fbmem;}

⌨️ 快捷键说明

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