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 + -
显示快捷键?