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

📄 lcd.c

📁 Linux环境下视频显示卡设备的驱动程序源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
		break;	default:		viaparinfo->lvds_setting_info->lcd_panel_hres = 800;		viaparinfo->lvds_setting_info->lcd_panel_vres = 600;		viaparinfo->lvds_setting_info->lcd_panel_id =			LCD_PANEL_ID1_800X600;		viaparinfo->lvds_setting_info->device_lcd_dualedge = 0;		viaparinfo->lvds_setting_info->LCDDithering = 1;		return VIA_RES_800X600;	}}static int lvds_register_read(int index){	u8 data;	viaparinfo->i2c_stuff.i2c_port = GPIOPORTINDEX;	viafb_i2c_readbyte((u8) viaparinfo->chip_info->	    lvds_chip_info.lvds_chip_slave_addr,			(u8) index, &data);	return data;}static void load_lcd_scaling(int set_hres, int set_vres, int panel_hres,		      int panel_vres){	int reg_value = 0;	int viafb_load_reg_num;	struct io_register *reg = NULL;	DEBUG_MSG(KERN_INFO "load_lcd_scaling()!!\n");	/* LCD Scaling Enable */	viafb_write_reg_mask(CR79, VIACR, 0x07, BIT0 + BIT1 + BIT2);	if (UNICHROME_P4M900 == viaparinfo->chip_info->gfx_chip_name) {		viafb_load_scaling_factor_for_p4m900(set_hres, set_vres,					       panel_hres, panel_vres);		return;	}	/* Check if expansion for horizontal */	if (set_hres != panel_hres) {		/* Load Horizontal Scaling Factor */		switch (viaparinfo->chip_info->gfx_chip_name) {		case UNICHROME_CLE266:		case UNICHROME_K400:			reg_value =			    CLE266_LCD_HOR_SCF_FORMULA(set_hres, panel_hres);			viafb_load_reg_num =			    lcd_scaling_factor_CLE.lcd_hor_scaling_factor.			    reg_num;			reg = lcd_scaling_factor_CLE.lcd_hor_scaling_factor.reg;			viafb_load_reg(reg_value,				viafb_load_reg_num, reg, VIACR);			break;		case UNICHROME_K800:		case UNICHROME_PM800:		case UNICHROME_CN700:		case UNICHROME_CX700:		case UNICHROME_K8M890:		case UNICHROME_P4M890:			reg_value =			    K800_LCD_HOR_SCF_FORMULA(set_hres, panel_hres);			/* Horizontal scaling enabled */			viafb_write_reg_mask(CRA2, VIACR, 0xC0, BIT7 + BIT6);			viafb_load_reg_num =			    lcd_scaling_factor.lcd_hor_scaling_factor.reg_num;			reg = lcd_scaling_factor.lcd_hor_scaling_factor.reg;			viafb_load_reg(reg_value,				viafb_load_reg_num, reg, VIACR);			break;		}		DEBUG_MSG(KERN_INFO "Horizontal Scaling value = %d", reg_value);	} else {		/* Horizontal scaling disabled */		viafb_write_reg_mask(CRA2, VIACR, 0x00, BIT7);	}	/* Check if expansion for vertical */	if (set_vres != panel_vres) {		/* Load Vertical Scaling Factor */		switch (viaparinfo->chip_info->gfx_chip_name) {		case UNICHROME_CLE266:		case UNICHROME_K400:			reg_value =			    CLE266_LCD_VER_SCF_FORMULA(set_vres, panel_vres);			viafb_load_reg_num =			    lcd_scaling_factor_CLE.lcd_ver_scaling_factor.			    reg_num;			reg = lcd_scaling_factor_CLE.lcd_ver_scaling_factor.reg;			viafb_load_reg(reg_value,				viafb_load_reg_num, reg, VIACR);			break;		case UNICHROME_K800:		case UNICHROME_PM800:		case UNICHROME_CN700:		case UNICHROME_CX700:		case UNICHROME_K8M890:		case UNICHROME_P4M890:			reg_value =			    K800_LCD_VER_SCF_FORMULA(set_vres, panel_vres);			/* Vertical scaling enabled */			viafb_write_reg_mask(CRA2, VIACR, 0x08, BIT3);			viafb_load_reg_num =			    lcd_scaling_factor.lcd_ver_scaling_factor.reg_num;			reg = lcd_scaling_factor.lcd_ver_scaling_factor.reg;			viafb_load_reg(reg_value,				viafb_load_reg_num, reg, VIACR);			break;		}		DEBUG_MSG(KERN_INFO "Vertical Scaling value = %d", reg_value);	} else {		/* Vertical scaling disabled */		viafb_write_reg_mask(CRA2, VIACR, 0x00, BIT3);	}}static void load_lcd_k400_patch_tbl(int set_hres, int set_vres,	int panel_id){	int vmode_index;	int reg_num = 0;	struct io_reg *lcd_patch_reg = NULL;	if (viaparinfo->lvds_setting_info->iga_path == IGA2)		vmode_index = viafb_get_mode_index(set_hres, set_vres, 1);	else		vmode_index = viafb_get_mode_index(set_hres, set_vres, 0);	switch (panel_id) {		/* LCD 800x600 */	case LCD_PANEL_ID1_800X600:		switch (vmode_index) {		case VIA_RES_640X400:		case VIA_RES_640X480:			reg_num = NUM_TOTAL_K400_LCD_RES_6X4_8X6;			lcd_patch_reg = K400_LCD_RES_6X4_8X6;			break;		case VIA_RES_720X480:		case VIA_RES_720X576:			reg_num = NUM_TOTAL_K400_LCD_RES_7X4_8X6;			lcd_patch_reg = K400_LCD_RES_7X4_8X6;			break;		}		break;		/* LCD 1024x768 */	case LCD_PANEL_ID2_1024X768:		switch (vmode_index) {		case VIA_RES_640X400:		case VIA_RES_640X480:			reg_num = NUM_TOTAL_K400_LCD_RES_6X4_10X7;			lcd_patch_reg = K400_LCD_RES_6X4_10X7;			break;		case VIA_RES_720X480:		case VIA_RES_720X576:			reg_num = NUM_TOTAL_K400_LCD_RES_7X4_10X7;			lcd_patch_reg = K400_LCD_RES_7X4_10X7;			break;		case VIA_RES_800X600:			reg_num = NUM_TOTAL_K400_LCD_RES_8X6_10X7;			lcd_patch_reg = K400_LCD_RES_8X6_10X7;			break;		}		break;		/* LCD 1280x1024 */	case LCD_PANEL_ID4_1280X1024:		switch (vmode_index) {		case VIA_RES_640X400:		case VIA_RES_640X480:			reg_num = NUM_TOTAL_K400_LCD_RES_6X4_12X10;			lcd_patch_reg = K400_LCD_RES_6X4_12X10;			break;		case VIA_RES_720X480:		case VIA_RES_720X576:			reg_num = NUM_TOTAL_K400_LCD_RES_7X4_12X10;			lcd_patch_reg = K400_LCD_RES_7X4_12X10;			break;		case VIA_RES_800X600:			reg_num = NUM_TOTAL_K400_LCD_RES_8X6_12X10;			lcd_patch_reg = K400_LCD_RES_8X6_12X10;			break;		case VIA_RES_1024X768:			reg_num = NUM_TOTAL_K400_LCD_RES_10X7_12X10;			lcd_patch_reg = K400_LCD_RES_10X7_12X10;			break;		}		break;		/* LCD 1400x1050 */	case LCD_PANEL_ID5_1400X1050:		switch (vmode_index) {		case VIA_RES_640X480:			reg_num = NUM_TOTAL_K400_LCD_RES_6X4_14X10;			lcd_patch_reg = K400_LCD_RES_6X4_14X10;			break;		case VIA_RES_800X600:			reg_num = NUM_TOTAL_K400_LCD_RES_8X6_14X10;			lcd_patch_reg = K400_LCD_RES_8X6_14X10;			break;		case VIA_RES_1024X768:			reg_num = NUM_TOTAL_K400_LCD_RES_10X7_14X10;			lcd_patch_reg = K400_LCD_RES_10X7_14X10;			break;		case VIA_RES_1280X768:		case VIA_RES_1280X800:		case VIA_RES_1280X960:		case VIA_RES_1280X1024:			reg_num = NUM_TOTAL_K400_LCD_RES_12X10_14X10;			lcd_patch_reg = K400_LCD_RES_12X10_14X10;			break;		}		break;		/* LCD 1600x1200 */	case LCD_PANEL_ID6_1600X1200:		switch (vmode_index) {		case VIA_RES_640X400:		case VIA_RES_640X480:			reg_num = NUM_TOTAL_K400_LCD_RES_6X4_16X12;			lcd_patch_reg = K400_LCD_RES_6X4_16X12;			break;		case VIA_RES_720X480:		case VIA_RES_720X576:			reg_num = NUM_TOTAL_K400_LCD_RES_7X4_16X12;			lcd_patch_reg = K400_LCD_RES_7X4_16X12;			break;		case VIA_RES_800X600:			reg_num = NUM_TOTAL_K400_LCD_RES_8X6_16X12;			lcd_patch_reg = K400_LCD_RES_8X6_16X12;			break;		case VIA_RES_1024X768:			reg_num = NUM_TOTAL_K400_LCD_RES_10X7_16X12;			lcd_patch_reg = K400_LCD_RES_10X7_16X12;			break;		case VIA_RES_1280X768:		case VIA_RES_1280X800:		case VIA_RES_1280X960:		case VIA_RES_1280X1024:			reg_num = NUM_TOTAL_K400_LCD_RES_12X10_16X12;			lcd_patch_reg = K400_LCD_RES_12X10_16X12;			break;		}		break;		/* LCD 1366x768 */	case LCD_PANEL_ID7_1366X768:		switch (vmode_index) {		case VIA_RES_640X480:			reg_num = NUM_TOTAL_K400_LCD_RES_6X4_1366X7;			lcd_patch_reg = K400_LCD_RES_6X4_1366X7;			break;		case VIA_RES_720X480:		case VIA_RES_720X576:			reg_num = NUM_TOTAL_K400_LCD_RES_7X4_1366X7;			lcd_patch_reg = K400_LCD_RES_7X4_1366X7;			break;		case VIA_RES_800X600:			reg_num = NUM_TOTAL_K400_LCD_RES_8X6_1366X7;			lcd_patch_reg = K400_LCD_RES_8X6_1366X7;			break;		case VIA_RES_1024X768:			reg_num = NUM_TOTAL_K400_LCD_RES_10X7_1366X7;			lcd_patch_reg = K400_LCD_RES_10X7_1366X7;			break;		case VIA_RES_1280X768:		case VIA_RES_1280X800:		case VIA_RES_1280X960:		case VIA_RES_1280X1024:			reg_num = NUM_TOTAL_K400_LCD_RES_12X10_1366X7;			lcd_patch_reg = K400_LCD_RES_12X10_1366X7;			break;		}		break;		/* LCD 1360x768 */	case LCD_PANEL_IDB_1360X768:		break;	}	if (reg_num != 0) {		/* H.W. Reset : ON */		viafb_write_reg_mask(CR17, VIACR, 0x00, BIT7);		viafb_write_regx(lcd_patch_reg, reg_num);		/* H.W. Reset : OFF */		viafb_write_reg_mask(CR17, VIACR, 0x80, BIT7);		/* Reset PLL */		viafb_write_reg_mask(SR40, VIASR, 0x02, BIT1);		viafb_write_reg_mask(SR40, VIASR, 0x00, BIT1);		/* Fire! */		outb(inb(VIARMisc) | (BIT2 + BIT3), VIAWMisc);	}}static void load_lcd_p880_patch_tbl(int set_hres, int set_vres,	int panel_id){	int vmode_index;	int reg_num = 0;	struct io_reg *lcd_patch_reg = NULL;	if (viaparinfo->lvds_setting_info->iga_path == IGA2)		vmode_index = viafb_get_mode_index(set_hres, set_vres, 1);	else		vmode_index = viafb_get_mode_index(set_hres, set_vres, 0);	switch (panel_id) {	case LCD_PANEL_ID5_1400X1050:		switch (vmode_index) {		case VIA_RES_640X480:			reg_num = NUM_TOTAL_P880_LCD_RES_6X4_14X10;			lcd_patch_reg = P880_LCD_RES_6X4_14X10;			break;		case VIA_RES_800X600:			reg_num = NUM_TOTAL_P880_LCD_RES_8X6_14X10;			lcd_patch_reg = P880_LCD_RES_8X6_14X10;			break;		}		break;	case LCD_PANEL_ID6_1600X1200:		switch (vmode_index) {		case VIA_RES_640X400:		case VIA_RES_640X480:			reg_num = NUM_TOTAL_P880_LCD_RES_6X4_16X12;			lcd_patch_reg = P880_LCD_RES_6X4_16X12;			break;		case VIA_RES_720X480:		case VIA_RES_720X576:			reg_num = NUM_TOTAL_P880_LCD_RES_7X4_16X12;			lcd_patch_reg = P880_LCD_RES_7X4_16X12;			break;		case VIA_RES_800X600:			reg_num = NUM_TOTAL_P880_LCD_RES_8X6_16X12;			lcd_patch_reg = P880_LCD_RES_8X6_16X12;			break;		case VIA_RES_1024X768:			reg_num = NUM_TOTAL_P880_LCD_RES_10X7_16X12;			lcd_patch_reg = P880_LCD_RES_10X7_16X12;			break;		case VIA_RES_1280X768:		case VIA_RES_1280X960:		case VIA_RES_1280X1024:			reg_num = NUM_TOTAL_P880_LCD_RES_12X10_16X12;			lcd_patch_reg = P880_LCD_RES_12X10_16X12;			break;		}		break;	}	if (reg_num != 0) {		/* H.W. Reset : ON */		viafb_write_reg_mask(CR17, VIACR, 0x00, BIT7);		viafb_write_regx(lcd_patch_reg, reg_num);		/* H.W. Reset : OFF */		viafb_write_reg_mask(CR17, VIACR, 0x80, BIT7);		/* Reset PLL */		viafb_write_reg_mask(SR40, VIASR, 0x02, BIT1);		viafb_write_reg_mask(SR40, VIASR, 0x00, BIT1);		/* Fire! */		outb(inb(VIARMisc) | (BIT2 + BIT3), VIAWMisc);	}}static void load_lcd_patch_regs(int set_hres, int set_vres,	int panel_id, int set_iga){	int vmode_index;	if (viaparinfo->lvds_setting_info->iga_path == IGA2)		vmode_index = viafb_get_mode_index(set_hres, set_vres, 1);	else		vmode_index = viafb_get_mode_index(set_hres, set_vres, 0);	viafb_unlock_crt();	/* Patch for simultaneous & Expansion */	if ((set_iga == IGA1_IGA2) &&		(viaparinfo->lvds_setting_info->display_method ==	    LCD_EXPANDSION)) {		switch (viaparinfo->chip_info->gfx_chip_name) {		case UNICHROME_CLE266:		case UNICHROME_K400:			load_lcd_k400_patch_tbl(set_hres, set_vres, panel_id);			break;		case UNICHROME_K800:			break;		case UNICHROME_PM800:		case UNICHROME_CN700:		case UNICHROME_CX700:			load_lcd_p880_patch_tbl(set_hres, set_vres, panel_id);		}	}	viafb_lock_crt();}static void via_pitch_alignment_patch_lcd(	struct lvds_setting_information *plvds_setting_info,				   struct lvds_chip_information				   *plvds_chip_info){	unsigned char cr13, cr35, cr65, cr66, cr67;	unsigned long dwScreenPitch = 0;	unsigned long dwPitch;	dwPitch = plvds_setting_info->h_active * (plvds_setting_info->bpp >> 3);	if (dwPitch & 0x1F) {		dwScreenPitch = ((dwPitch + 31) & ~31) >> 3;		if (plvds_setting_info->iga_path == IGA2) {			if (plvds_setting_info->bpp > 8) {				cr66 = (unsigned char)(dwScreenPitch & 0xFF);				viafb_write_reg(CR66, VIACR, cr66);				cr67 = viafb_read_reg(VIACR, CR67) & 0xFC;				cr67 |=				    (unsigned				     char)((dwScreenPitch & 0x300) >> 8);				viafb_write_reg(CR67, VIACR, cr67);			}			/* Fetch Count */			cr67 = viafb_read_reg(VIACR, CR67) & 0xF3;			cr67 |= (unsigned char)((dwScreenPitch & 0x600) >> 7);			viafb_write_reg(CR67, VIACR, cr67);			cr65 = (unsigned char)((dwScreenPitch >> 1) & 0xFF);			cr65 += 2;			viafb_write_reg(CR65, VIACR, cr65);		} else {			if (plvds_setting_info->bpp > 8) {				cr13 = (unsigned char)(dwScreenPitch & 0xFF);				viafb_write_reg(CR13, VIACR, cr13);				cr35 = viafb_read_reg(VIACR, CR35) & 0x1F;				cr35 |=				    (unsigned				     char)((dwScreenPitch & 0x700) >> 3);				viafb_write_reg(CR35, VIACR, cr35);			}		}	}}static void lcd_patch_skew_dvp0(struct lvds_setting_information			 *plvds_setting_info,			 struct lvds_chip_information *plvds_chip_info){	if (VT1636_LVDS == plvds_chip_info->lvds_chip_name) {		switch (viaparinfo->chip_info->gfx_chip_name) {		case UNICHROME_P4M900:

⌨️ 快捷键说明

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