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

📄 dvi.c

📁 via framebuffer driver
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	return ret;}/* Query Flat Panel's EDID Table Version Through DVI Connector */static int viafb_dvi_query_EDID(void){	u8 data0, data1;	int restore;	DEBUG_MSG(KERN_INFO "viafb_dvi_query_EDID!!\n");	restore = viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr;	viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr = 0xA0;	data0 = (u8) tmds_register_read(0x00);	data1 = (u8) tmds_register_read(0x01);	if ((data0 == 0) && (data1 == 0xFF)) {		viaparinfo->chip_info->			tmds_chip_info.tmds_chip_slave_addr = restore;		return (EDID_VERSION_1);	/* Found EDID1 Table */	}	data0 = (u8) tmds_register_read(0x00);	viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr = restore;	if (data0 == 0x20)		return (EDID_VERSION_2);	/* Found EDID2 Table */	else		return (FALSE);}/* * * int dvi_get_panel_size_from_DDCv1(void) * *     - Get Panel Size Using EDID1 Table * * Return Type:    int * */static int dvi_get_panel_size_from_DDCv1(void){	int i, max_h = 0, max_v = 0, tmp, restore;	unsigned char rData;	unsigned char EDID_DATA[18];	DEBUG_MSG(KERN_INFO "\n dvi_get_panel_size_from_DDCv1 \n");	restore = viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr;	viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr = 0xA0;	rData = tmds_register_read(0x23);	if (rData & 0x3C)		max_h = 640;	if (rData & 0xC0)		max_h = 720;	if (rData & 0x03)		max_h = 800;	rData = tmds_register_read(0x24);	if (rData & 0xC0)		max_h = 800;	if (rData & 0x1E)		max_h = 1024;	if (rData & 0x01)		max_h = 1280;	for (i = 0x25; i < 0x6D; i++) {		switch (i) {		case 0x26:		case 0x28:		case 0x2A:		case 0x2C:		case 0x2E:		case 0x30:		case 0x32:		case 0x34:			rData = tmds_register_read(i);			if (rData == 1)				break;			/* data = (data + 31) * 8 */			tmp = (rData + 31) << 3;			if (tmp > max_h)				max_h = tmp;			break;		case 0x36:		case 0x48:		case 0x5A:		case 0x6C:			tmds_register_read_bytes(i, EDID_DATA, 10);			if (!(EDID_DATA[0] || EDID_DATA[1])) {				/* The first two byte must be zero. */				if (EDID_DATA[3] == 0xFD) {					/* To get max pixel clock. */					viaparinfo->tmds_setting_info->					max_pixel_clock = EDID_DATA[9] * 10;				}			}			break;		default:			break;		}	}	switch (max_h) {	case 640:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_640X480;		break;	case 800:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_800X600;		break;	case 1024:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_1024X768;		break;	case 1280:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_1280X1024;		break;	case 1400:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_1400X1050;		break;	case 1440:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_1440X1050;		break;	case 1600:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_1600X1200;		break;	case 1920:		if (max_v == 1200) {			viaparinfo->tmds_setting_info->dvi_panel_size =				VIA_RES_1920X1200;		} else {			viaparinfo->tmds_setting_info->dvi_panel_size =				VIA_RES_1920X1080;		}		break;	default:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_1024X768;		DEBUG_MSG(KERN_INFO "Unknow panel size max resolution = %d !\					 set default panel size.\n", max_h);		break;	}	DEBUG_MSG(KERN_INFO "DVI max pixelclock = %d\n",		  viaparinfo->tmds_setting_info->max_pixel_clock);	viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr = restore;	return viaparinfo->tmds_setting_info->dvi_panel_size;}/* * * int dvi_get_panel_size_from_DDCv2(void) * *     - Get Panel Size Using EDID2 Table * * Return Type:    int * */static int dvi_get_panel_size_from_DDCv2(void){	int HSize = 0, restore;	unsigned char R_Buffer[2];	DEBUG_MSG(KERN_INFO "\n dvi_get_panel_size_from_DDCv2 \n");	restore = viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr;	viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr = 0xA2;	/* Horizontal: 0x76, 0x77 */	tmds_register_read_bytes(0x76, R_Buffer, 2);	HSize = R_Buffer[0];	HSize += R_Buffer[1] << 8;	switch (HSize) {	case 640:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_640X480;		break;	case 800:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_800X600;		break;	case 1024:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_1024X768;		break;	case 1280:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_1280X1024;		break;	case 1400:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_1400X1050;		break;	case 1440:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_1440X1050;		break;	case 1600:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_1600X1200;		break;	default:		viaparinfo->tmds_setting_info->dvi_panel_size =			VIA_RES_1024X768;		DEBUG_MSG(KERN_INFO "Unknow panel size max resolution = %d!\					set default panel size.\n", HSize);		break;	}	viaparinfo->chip_info->tmds_chip_info.tmds_chip_slave_addr = restore;	return viaparinfo->tmds_setting_info->dvi_panel_size;}/* * * unsigned char dvi_get_panel_info(void) * *     - Get Panel Size * * Return Type:    unsigned char */static unsigned char dvi_get_panel_info(void){	DEBUG_MSG(KERN_INFO "dvi_get_panel_info! \n");	viafb_dvi_sense();	switch (viafb_dvi_query_EDID()) {	case 1:		dvi_get_panel_size_from_DDCv1();		break;	case 2:		dvi_get_panel_size_from_DDCv2();		break;	default:		break;	}	DEBUG_MSG(KERN_INFO "dvi panel size is %2d \n",		  viaparinfo->tmds_setting_info->dvi_panel_size);	return (unsigned char)(viaparinfo->tmds_setting_info->dvi_panel_size);}/* If Disable DVI, turn off pad */void viafb_dvi_disable(void){	if (viaparinfo->chip_info->		tmds_chip_info.output_interface == INTERFACE_DVP0)		viafb_write_reg(SR1E, VIASR,		viafb_read_reg(VIASR, SR1E) & (~0xC0));	if (viaparinfo->chip_info->		tmds_chip_info.output_interface == INTERFACE_DVP1)		viafb_write_reg(SR1E, VIASR,		viafb_read_reg(VIASR, SR1E) & (~0x30));	if (viaparinfo->chip_info->		tmds_chip_info.output_interface == INTERFACE_DFP_HIGH)		viafb_write_reg(SR2A, VIASR,		viafb_read_reg(VIASR, SR2A) & (~0x0C));	if (viaparinfo->chip_info->		tmds_chip_info.output_interface == INTERFACE_DFP_LOW)		viafb_write_reg(SR2A, VIASR,		viafb_read_reg(VIASR, SR2A) & (~0x03));	if (viaparinfo->chip_info->		tmds_chip_info.output_interface == INTERFACE_TMDS)		/* Turn off TMDS power. */		viafb_write_reg(CRD2, VIACR,		viafb_read_reg(VIACR, CRD2) | 0x08);}/* If Enable DVI, turn off pad */void viafb_dvi_enable(void){	u8 data;	if (viaparinfo->chip_info->		tmds_chip_info.output_interface == INTERFACE_DVP0) {		viafb_write_reg(SR1E, VIASR,			viafb_read_reg(VIASR, SR1E) | 0xC0);		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266)			tmds_register_write(0x88, 0x3b);		else			/*clear CR91[5] to direct on display period			   in the secondary diplay path */			viafb_write_reg(CR91, VIACR,			viafb_read_reg(VIACR, CR91) & 0xDF);	}	if (viaparinfo->chip_info->		tmds_chip_info.output_interface == INTERFACE_DVP1) {		viafb_write_reg(SR1E, VIASR,			viafb_read_reg(VIASR, SR1E) | 0x30);		/*fix dvi cann't be enabled with MB VT5718C4 - Al Zhang */		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {			tmds_register_write(0x88, 0x3b);		} else {			/*clear CR91[5] to direct on display period			  in the secondary diplay path */			viafb_write_reg(CR91, VIACR,			viafb_read_reg(VIACR, CR91) & 0xDF);		}		/*fix DVI cannot enable on EPIA-M board */		if (viafb_platform_epia_dvi == 1) {			viafb_write_reg_mask(CR91, VIACR, 0x1f, 0x1f);			viafb_write_reg_mask(CR88, VIACR, 0x00, BIT6 + BIT0);			if (via_bus_width == 24) {				if (viafb_device_lcd_dualedge == 1)					data = 0x3F;				else					data = 0x37;				viafb_i2cWriteByte(viaparinfo->chip_info->					     tmds_chip_info.					     tmds_chip_slave_addr,					     0x08, data);			}		}	}	if (viaparinfo->chip_info->		tmds_chip_info.output_interface == INTERFACE_DFP_HIGH) {		viafb_write_reg(SR2A, VIASR,			viafb_read_reg(VIASR, SR2A) | 0x0C);		viafb_write_reg(CR91, VIACR,			viafb_read_reg(VIACR, CR91) & 0xDF);	}	if (viaparinfo->chip_info->		tmds_chip_info.output_interface == INTERFACE_DFP_LOW) {		viafb_write_reg(SR2A, VIASR,			viafb_read_reg(VIASR, SR2A) | 0x03);		viafb_write_reg(CR91, VIACR,			viafb_read_reg(VIACR, CR91) & 0xDF);	}	if (viaparinfo->chip_info->		tmds_chip_info.output_interface == INTERFACE_TMDS) {		/* Turn on Display period in the panel path. */		viafb_write_reg_mask(CR91, VIACR, 0, BIT7);		/* Turn on TMDS power. */		viafb_write_reg_mask(CRD2, VIACR, 0, BIT3);	}}

⌨️ 快捷键说明

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