⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 via framebuffer driver
💻 C
📖 第 1 页 / 共 4 页
字号:
static void fill_lcd_format(void){	u8 bdithering = 0, bdual = 0;	if (viaparinfo->lvds_setting_info->device_lcd_dualedge)		bdual = BIT4;	if (viaparinfo->lvds_setting_info->LCDDithering)		bdithering = BIT0;	/* Dual & Dithering */	viafb_write_reg_mask(CR88, VIACR, (bdithering | bdual), BIT4 + BIT0);}static void check_diport_of_integrated_lvds(	struct lvds_chip_information *plvds_chip_info,				     struct lvds_setting_information				     *plvds_setting_info){	/* Determine LCD DI Port by hardware layout. */	switch (viafb_display_hardware_layout) {	case HW_LAYOUT_LCD_ONLY:		{			if (plvds_setting_info->device_lcd_dualedge) {				plvds_chip_info->output_interface =				    INTERFACE_LVDS0LVDS1;			} else {				plvds_chip_info->output_interface =				    INTERFACE_LVDS0;			}			break;		}	case HW_LAYOUT_DVI_ONLY:		{			plvds_chip_info->output_interface = INTERFACE_NONE;			break;		}	case HW_LAYOUT_LCD1_LCD2:	case HW_LAYOUT_LCD_EXTERNAL_LCD2:		{			plvds_chip_info->output_interface =			    INTERFACE_LVDS0LVDS1;			break;		}	case HW_LAYOUT_LCD_DVI:		{			plvds_chip_info->output_interface = INTERFACE_LVDS1;			break;		}	default:		{			plvds_chip_info->output_interface = INTERFACE_LVDS1;			break;		}	}	DEBUG_MSG(KERN_INFO		  "Display Hardware Layout: 0x%x, LCD DI Port: 0x%x\n",		  viafb_display_hardware_layout,		  plvds_chip_info->output_interface);}void viafb_init_lvds_output_interface(struct lvds_chip_information				*plvds_chip_info,				struct lvds_setting_information				*plvds_setting_info){	if (INTERFACE_NONE != plvds_chip_info->output_interface) {		/*Do nothing, lcd port is specified by module parameter */		return;	}	switch (plvds_chip_info->lvds_chip_name) {	case VT1636_LVDS:		switch (viaparinfo->chip_info->gfx_chip_name) {		case UNICHROME_CX700:			plvds_chip_info->output_interface = INTERFACE_DVP1;			break;		case UNICHROME_CN700:			plvds_chip_info->output_interface = INTERFACE_DFP_LOW;			break;		default:			plvds_chip_info->output_interface = INTERFACE_DVP0;			break;		}		break;	case INTEGRATED_LVDS:		check_diport_of_integrated_lvds(plvds_chip_info,						plvds_setting_info);		break;	default:		switch (viaparinfo->chip_info->gfx_chip_name) {		case UNICHROME_K8M890:		case UNICHROME_P4M900:		case UNICHROME_P4M890:			plvds_chip_info->output_interface = INTERFACE_DFP_LOW;			break;		default:			plvds_chip_info->output_interface = INTERFACE_DFP;			break;		}		break;	}}static struct display_timing lcd_centering_timging(struct display_timing					    mode_crt_reg,					    struct display_timing panel_crt_reg){	struct display_timing crt_reg;	crt_reg.hor_total = panel_crt_reg.hor_total;	crt_reg.hor_addr = mode_crt_reg.hor_addr;	crt_reg.hor_blank_start =	    (panel_crt_reg.hor_addr - mode_crt_reg.hor_addr) / 2 +	    crt_reg.hor_addr;	crt_reg.hor_blank_end = panel_crt_reg.hor_blank_end;	crt_reg.hor_sync_start =	    (panel_crt_reg.hor_sync_start -	     panel_crt_reg.hor_blank_start) + crt_reg.hor_blank_start;	crt_reg.hor_sync_end = panel_crt_reg.hor_sync_end;	crt_reg.ver_total = panel_crt_reg.ver_total;	crt_reg.ver_addr = mode_crt_reg.ver_addr;	crt_reg.ver_blank_start =	    (panel_crt_reg.ver_addr - mode_crt_reg.ver_addr) / 2 +	    crt_reg.ver_addr;	crt_reg.ver_blank_end = panel_crt_reg.ver_blank_end;	crt_reg.ver_sync_start =	    (panel_crt_reg.ver_sync_start -	     panel_crt_reg.ver_blank_start) + crt_reg.ver_blank_start;	crt_reg.ver_sync_end = panel_crt_reg.ver_sync_end;	return crt_reg;}static void load_crtc_shadow_timing(struct display_timing mode_timing,			     struct display_timing panel_timing){	struct io_register *reg = NULL;	int i;	int viafb_load_reg_Num = 0;	int reg_value = 0;	if (viaparinfo->lvds_setting_info->display_method == LCD_EXPANDSION) {		/* Expansion */		for (i = 12; i < 20; i++) {			switch (i) {			case H_TOTAL_SHADOW_INDEX:				reg_value =				    IGA2_HOR_TOTAL_SHADOW_FORMULA				    (panel_timing.hor_total);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.hor_total_shadow.				    reg_num;				reg = iga2_shadow_crtc_reg.hor_total_shadow.reg;				break;			case H_BLANK_END_SHADOW_INDEX:				reg_value =				    IGA2_HOR_BLANK_END_SHADOW_FORMULA				    (panel_timing.hor_blank_start,				     panel_timing.hor_blank_end);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.				    hor_blank_end_shadow.reg_num;				reg =				    iga2_shadow_crtc_reg.				    hor_blank_end_shadow.reg;				break;			case V_TOTAL_SHADOW_INDEX:				reg_value =				    IGA2_VER_TOTAL_SHADOW_FORMULA				    (panel_timing.ver_total);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.ver_total_shadow.				    reg_num;				reg = iga2_shadow_crtc_reg.ver_total_shadow.reg;				break;			case V_ADDR_SHADOW_INDEX:				reg_value =				    IGA2_VER_ADDR_SHADOW_FORMULA				    (panel_timing.ver_addr);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.ver_addr_shadow.				    reg_num;				reg = iga2_shadow_crtc_reg.ver_addr_shadow.reg;				break;			case V_BLANK_SATRT_SHADOW_INDEX:				reg_value =				    IGA2_VER_BLANK_START_SHADOW_FORMULA				    (panel_timing.ver_blank_start);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.				    ver_blank_start_shadow.reg_num;				reg =				    iga2_shadow_crtc_reg.				    ver_blank_start_shadow.reg;				break;			case V_BLANK_END_SHADOW_INDEX:				reg_value =				    IGA2_VER_BLANK_END_SHADOW_FORMULA				    (panel_timing.ver_blank_start,				     panel_timing.ver_blank_end);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.				    ver_blank_end_shadow.reg_num;				reg =				    iga2_shadow_crtc_reg.				    ver_blank_end_shadow.reg;				break;			case V_SYNC_SATRT_SHADOW_INDEX:				reg_value =				    IGA2_VER_SYNC_START_SHADOW_FORMULA				    (panel_timing.ver_sync_start);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.				    ver_sync_start_shadow.reg_num;				reg =				    iga2_shadow_crtc_reg.				    ver_sync_start_shadow.reg;				break;			case V_SYNC_END_SHADOW_INDEX:				reg_value =				    IGA2_VER_SYNC_END_SHADOW_FORMULA				    (panel_timing.ver_sync_start,				     panel_timing.ver_sync_end);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.				    ver_sync_end_shadow.reg_num;				reg =				    iga2_shadow_crtc_reg.				    ver_sync_end_shadow.reg;				break;			}			viafb_load_reg(reg_value,				viafb_load_reg_Num, reg, VIACR);		}	} else {		/* Centering */		for (i = 12; i < 20; i++) {			switch (i) {			case H_TOTAL_SHADOW_INDEX:				reg_value =				    IGA2_HOR_TOTAL_SHADOW_FORMULA				    (panel_timing.hor_total);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.hor_total_shadow.				    reg_num;				reg = iga2_shadow_crtc_reg.hor_total_shadow.reg;				break;			case H_BLANK_END_SHADOW_INDEX:				reg_value =				    IGA2_HOR_BLANK_END_SHADOW_FORMULA				    (panel_timing.hor_blank_start,				     panel_timing.hor_blank_end);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.				    hor_blank_end_shadow.reg_num;				reg =				    iga2_shadow_crtc_reg.				    hor_blank_end_shadow.reg;				break;			case V_TOTAL_SHADOW_INDEX:				reg_value =				    IGA2_VER_TOTAL_SHADOW_FORMULA				    (panel_timing.ver_total);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.ver_total_shadow.				    reg_num;				reg = iga2_shadow_crtc_reg.ver_total_shadow.reg;				break;			case V_ADDR_SHADOW_INDEX:				reg_value =				    IGA2_VER_ADDR_SHADOW_FORMULA				    (mode_timing.ver_addr);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.ver_addr_shadow.				    reg_num;				reg = iga2_shadow_crtc_reg.ver_addr_shadow.reg;				break;			case V_BLANK_SATRT_SHADOW_INDEX:				reg_value =				    IGA2_VER_BLANK_START_SHADOW_FORMULA				    (mode_timing.ver_blank_start);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.				    ver_blank_start_shadow.reg_num;				reg =				    iga2_shadow_crtc_reg.				    ver_blank_start_shadow.reg;				break;			case V_BLANK_END_SHADOW_INDEX:				reg_value =				    IGA2_VER_BLANK_END_SHADOW_FORMULA				    (panel_timing.ver_blank_start,				     panel_timing.ver_blank_end);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.				    ver_blank_end_shadow.reg_num;				reg =				    iga2_shadow_crtc_reg.				    ver_blank_end_shadow.reg;				break;			case V_SYNC_SATRT_SHADOW_INDEX:				reg_value =				    IGA2_VER_SYNC_START_SHADOW_FORMULA(				    (panel_timing.ver_sync_start -				    panel_timing.ver_blank_start) +				    (panel_timing.ver_addr -				    mode_timing.ver_addr) / 2 +				    mode_timing.ver_addr);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.ver_sync_start_shadow.				    reg_num;				reg =				    iga2_shadow_crtc_reg.ver_sync_start_shadow.				    reg;				break;			case V_SYNC_END_SHADOW_INDEX:				reg_value =				    IGA2_VER_SYNC_END_SHADOW_FORMULA(				    (panel_timing.ver_sync_start -				    panel_timing.ver_blank_start) +				    (panel_timing.ver_addr -				    mode_timing.ver_addr) / 2 +				    mode_timing.ver_addr,				    panel_timing.ver_sync_end);				viafb_load_reg_Num =				    iga2_shadow_crtc_reg.ver_sync_end_shadow.				    reg_num;				reg =				    iga2_shadow_crtc_reg.ver_sync_end_shadow.				    reg;				break;			}			viafb_load_reg(reg_value,				viafb_load_reg_Num, reg, VIACR);		}	}}bool viafb_lcd_get_mobile_state(bool *mobile){	unsigned char *romptr, *tableptr;	u8 core_base;	unsigned char *biosptr;	/* Rom address */	u32 romaddr = 0x000C0000;	u16 start_pattern = 0;	biosptr = ioremap(romaddr, 0x10000);	memcpy(&start_pattern, biosptr, 2);	/* Compare pattern */	if (start_pattern == 0xAA55) {		/* Get the start of Table */		/* 0x1B means BIOS offset position */		romptr = biosptr + 0x1B;		tableptr = biosptr + *((u16 *) romptr);		/* Get the start of biosver structure */		/* 18 means BIOS version position. */		romptr = tableptr + 18;		romptr = biosptr + *((u16 *) romptr);		/* The offset should be 44, but the		   actual image is less three char. */		/* pRom += 44; */		romptr += 41;		core_base = *romptr++;		if (core_base & 0x8) {			*mobile = FALSE;		} else {			*mobile = TRUE;		}		/* release memory */		iounmap(biosptr);		return TRUE;	} else {		iounmap(biosptr);		return FALSE;	}}static void viafb_load_scaling_factor_for_p4m900(int set_hres,	int set_vres, int panel_hres, int panel_vres){	int h_scaling_factor;	int v_scaling_factor;	u8 cra2 = 0;	u8 cr77 = 0;	u8 cr78 = 0;	u8 cr79 = 0;	u8 cr9f = 0;	/* Check if expansion for horizontal */	if (set_hres < panel_hres) {		/* Load Horizontal Scaling Factor */		/* For VIA_K8M800 or later chipsets. */		h_scaling_factor =		    K800_LCD_HOR_SCF_FORMULA(set_hres, panel_hres);		/* HSCaleFactor[1:0] at CR9F[1:0] */		cr9f = h_scaling_factor & 0x0003;		/* HSCaleFactor[9:2] at CR77[7:0] */		cr77 = (h_scaling_factor & 0x03FC) >> 2;		/* HSCaleFactor[11:10] at CR79[5:4] */		cr79 = (h_scaling_factor & 0x0C00) >> 10;		cr79 <<= 4;		/* Horizontal scaling enabled */		cra2 = 0xC0;		DEBUG_MSG(KERN_INFO "Horizontal Scaling value = %d\n",			  h_scaling_factor);	} else {		/* Horizontal scaling disabled */		cra2 = 0x00;	}	/* Check if expansion for vertical */	if (set_vres < panel_vres) {		/* Load Vertical Scaling Factor */		/* For VIA_K8M800 or later chipsets. */		v_scaling_factor =		    K800_LCD_VER_SCF_FORMULA(set_vres, panel_vres);		/* Vertical scaling enabled */		cra2 |= 0x08;		/* VSCaleFactor[0] at CR79[3] */		cr79 |= ((v_scaling_factor & 0x0001) << 3);		/* VSCaleFactor[8:1] at CR78[7:0] */		cr78 |= (v_scaling_factor & 0x01FE) >> 1;		/* VSCaleFactor[10:9] at CR79[7:6] */		cr79 |= ((v_scaling_factor & 0x0600) >> 9) << 6;		DEBUG_MSG(KERN_INFO "Vertical Scaling value = %d\n",			  v_scaling_factor);	} else {		/* Vertical scaling disabled */		cra2 |= 0x00;	}	viafb_write_reg_mask(CRA2, VIACR, cra2, BIT3 + BIT6 + BIT7);	viafb_write_reg_mask(CR77, VIACR, cr77, 0xFF);	viafb_write_reg_mask(CR78, VIACR, cr78, 0xFF);	viafb_write_reg_mask(CR79, VIACR, cr79, 0xF8);	viafb_write_reg_mask(CR9F, VIACR, cr9f, BIT0 + BIT1);}

⌨️ 快捷键说明

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