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

📄 hw.c

📁 via framebuffer driver
💻 C
📖 第 1 页 / 共 5 页
字号:
			case H_BLANK_END_INDEX:				reg_value =				    IGA2_HOR_BLANK_END_FORMULA				    (device_timing.hor_blank_start,				     device_timing.hor_blank_end);				viafb_load_reg_num =				    iga2_crtc_reg.hor_blank_end.reg_num;				reg = iga2_crtc_reg.hor_blank_end.reg;				break;			case H_SYNC_START_INDEX:				reg_value =				    IGA2_HOR_SYNC_START_FORMULA				    (device_timing.hor_sync_start);				if (UNICHROME_CN700 <=					viaparinfo->chip_info->gfx_chip_name)					viafb_load_reg_num =					    iga2_crtc_reg.hor_sync_start.					    reg_num;				else					viafb_load_reg_num = 3;				reg = iga2_crtc_reg.hor_sync_start.reg;				break;			case H_SYNC_END_INDEX:				reg_value =				    IGA2_HOR_SYNC_END_FORMULA				    (device_timing.hor_sync_start,				     device_timing.hor_sync_end);				viafb_load_reg_num =				    iga2_crtc_reg.hor_sync_end.reg_num;				reg = iga2_crtc_reg.hor_sync_end.reg;				break;			case V_TOTAL_INDEX:				reg_value =				    IGA2_VER_TOTAL_FORMULA(device_timing.							   ver_total);				viafb_load_reg_num =					iga2_crtc_reg.ver_total.reg_num;				reg = iga2_crtc_reg.ver_total.reg;				break;			case V_ADDR_INDEX:				reg_value =				    IGA2_VER_ADDR_FORMULA(device_timing.							  ver_addr);				viafb_load_reg_num =					iga2_crtc_reg.ver_addr.reg_num;				reg = iga2_crtc_reg.ver_addr.reg;				break;			case V_BLANK_START_INDEX:				reg_value =				    IGA2_VER_BLANK_START_FORMULA				    (device_timing.ver_blank_start);				viafb_load_reg_num =				    iga2_crtc_reg.ver_blank_start.reg_num;				reg = iga2_crtc_reg.ver_blank_start.reg;				break;			case V_BLANK_END_INDEX:				reg_value =				    IGA2_VER_BLANK_END_FORMULA				    (device_timing.ver_blank_start,				     device_timing.ver_blank_end);				viafb_load_reg_num =				    iga2_crtc_reg.ver_blank_end.reg_num;				reg = iga2_crtc_reg.ver_blank_end.reg;				break;			case V_SYNC_START_INDEX:				reg_value =				    IGA2_VER_SYNC_START_FORMULA				    (device_timing.ver_sync_start);				viafb_load_reg_num =				    iga2_crtc_reg.ver_sync_start.reg_num;				reg = iga2_crtc_reg.ver_sync_start.reg;				break;			case V_SYNC_END_INDEX:				reg_value =				    IGA2_VER_SYNC_END_FORMULA				    (device_timing.ver_sync_start,				     device_timing.ver_sync_end);				viafb_load_reg_num =				    iga2_crtc_reg.ver_sync_end.reg_num;				reg = iga2_crtc_reg.ver_sync_end.reg;				break;			}		}		viafb_load_reg(reg_value, viafb_load_reg_num, reg, VIACR);	}	viafb_lock_crt();}void viafb_set_color_depth(int bpp_byte, int set_iga){	if (set_iga == IGA1) {		switch (bpp_byte) {		case MODE_8BPP:			viafb_write_reg_mask(SR15, VIASR, 0x22, 0x7E);			break;		case MODE_16BPP:			viafb_write_reg_mask(SR15, VIASR, 0xB6, 0xFE);			break;		case MODE_32BPP:			viafb_write_reg_mask(SR15, VIASR, 0xAE, 0xFE);			break;		}	} else {		switch (bpp_byte) {		case MODE_8BPP:			viafb_write_reg_mask(CR67, VIACR, 0x00, BIT6 + BIT7);			break;		case MODE_16BPP:			viafb_write_reg_mask(CR67, VIACR, 0x40, BIT6 + BIT7);			break;		case MODE_32BPP:			viafb_write_reg_mask(CR67, VIACR, 0xC0, BIT6 + BIT7);			break;		}	}}void viafb_fill_crtc_timing(struct crt_mode_table *crt_table,	int mode_index, int bpp_byte, int set_iga){	struct VideoModeTable *video_mode;	struct display_timing crt_reg;	int i;	int index = 0;	int h_addr, v_addr;	u32 pll_D_N;	video_mode = &CLE266Modes[search_mode_setting(mode_index)];	for (i = 0; i < video_mode->mode_array; i++) {		index = i;		if (crt_table[i].refresh_rate == viaparinfo->			crt_setting_info->refresh_rate)			break;	}	crt_reg = crt_table[index].crtc;	/* Mode 640x480 has border, but LCD/DFP didn't have border. */	/* So we would delete border. */	if ((viafb_LCD_ON | viafb_DVI_ON) && (mode_index == VIA_RES_640X480)	    && (viaparinfo->crt_setting_info->refresh_rate == 60)) {		/* The border is 8 pixels. */		crt_reg.hor_blank_start = crt_reg.hor_blank_start - 8;		/* Blanking time should add left and right borders. */		crt_reg.hor_blank_end = crt_reg.hor_blank_end + 16;	}	h_addr = crt_reg.hor_addr;	v_addr = crt_reg.ver_addr;	/* update polarity for CRT timing */	if (crt_table[index].h_sync_polarity == NEGATIVE) {		if (crt_table[index].v_sync_polarity == NEGATIVE)			outb((inb(VIARMisc) & (~(BIT6 + BIT7))) |			     (BIT6 + BIT7), VIAWMisc);		else			outb((inb(VIARMisc) & (~(BIT6 + BIT7))) | (BIT6),			     VIAWMisc);	} else {		if (crt_table[index].v_sync_polarity == NEGATIVE)			outb((inb(VIARMisc) & (~(BIT6 + BIT7))) | (BIT7),			     VIAWMisc);		else			outb((inb(VIARMisc) & (~(BIT6 + BIT7))), VIAWMisc);	}	if (set_iga == IGA1) {		viafb_unlock_crt();		viafb_write_reg(CR09, VIACR, 0x00);	/*initial CR09=0 */		viafb_write_reg_mask(CR11, VIACR, 0x00, BIT4 + BIT5 + BIT6);		viafb_write_reg_mask(CR17, VIACR, 0x00, BIT7);	}	switch (set_iga) {	case IGA1:		viafb_load_crtc_timing(crt_reg, IGA1);		break;	case IGA2:		viafb_load_crtc_timing(crt_reg, IGA2);		break;	}	load_fix_bit_crtc_reg();	viafb_lock_crt();	viafb_write_reg_mask(CR17, VIACR, 0x80, BIT7);	viafb_load_offset_reg(h_addr, bpp_byte, set_iga);	viafb_load_fetch_count_reg(h_addr, bpp_byte, set_iga);	/* load FIFO */	if ((viaparinfo->chip_info->gfx_chip_name != UNICHROME_CLE266)	    && (viaparinfo->chip_info->gfx_chip_name != UNICHROME_K400))		viafb_load_FIFO_reg(set_iga, h_addr, v_addr);	/* load SR Register About Memory and Color part */	viafb_set_color_depth(bpp_byte, set_iga);	pll_D_N = viafb_get_clk_value(crt_table[index].clk);	DEBUG_MSG(KERN_INFO "PLL=%x", pll_D_N);	viafb_set_vclock(pll_D_N, set_iga);}void viafb_init_chip_info(void){	init_gfx_chip_info();	init_tmds_chip_info();	init_lvds_chip_info();	viaparinfo->crt_setting_info->iga_path = IGA1;	viaparinfo->crt_setting_info->refresh_rate = viafb_refresh;	/*Set IGA path for each device */	viafb_set_iga_path();	viaparinfo->lvds_setting_info->display_method = viafb_lcd_dsp_method;	viaparinfo->lvds_setting_info->get_lcd_size_method =		GET_LCD_SIZE_BY_USER_SETTING;	viaparinfo->lvds_setting_info->lcd_mode = viafb_lcd_mode;	viaparinfo->lvds_setting_info2->display_method =		viaparinfo->lvds_setting_info->display_method;	viaparinfo->lvds_setting_info2->lcd_mode =		viaparinfo->lvds_setting_info->lcd_mode;}void viafb_update_device_setting(int hres, int vres,	int bpp, int vmode_refresh, int flag){	if (flag == 0) {		viaparinfo->crt_setting_info->h_active = hres;		viaparinfo->crt_setting_info->v_active = vres;		viaparinfo->crt_setting_info->bpp = bpp;		viaparinfo->crt_setting_info->refresh_rate =			vmode_refresh;		viaparinfo->tmds_setting_info->h_active = hres;		viaparinfo->tmds_setting_info->v_active = vres;		viaparinfo->tmds_setting_info->bpp = bpp;		viaparinfo->tmds_setting_info->refresh_rate =			vmode_refresh;		viaparinfo->lvds_setting_info->h_active = hres;		viaparinfo->lvds_setting_info->v_active = vres;		viaparinfo->lvds_setting_info->bpp = bpp;		viaparinfo->lvds_setting_info->refresh_rate =			vmode_refresh;		viaparinfo->lvds_setting_info2->h_active = hres;		viaparinfo->lvds_setting_info2->v_active = vres;		viaparinfo->lvds_setting_info2->bpp = bpp;		viaparinfo->lvds_setting_info2->refresh_rate =			vmode_refresh;	} else {		if (viaparinfo->tmds_setting_info->iga_path == IGA2) {			viaparinfo->tmds_setting_info->h_active = hres;			viaparinfo->tmds_setting_info->v_active = vres;			viaparinfo->tmds_setting_info->bpp = bpp;			viaparinfo->tmds_setting_info->refresh_rate =				vmode_refresh;		}		if (viaparinfo->lvds_setting_info->iga_path == IGA2) {			viaparinfo->lvds_setting_info->h_active = hres;			viaparinfo->lvds_setting_info->v_active = vres;			viaparinfo->lvds_setting_info->bpp = bpp;			viaparinfo->lvds_setting_info->refresh_rate =				vmode_refresh;		}		if (IGA2 == viaparinfo->lvds_setting_info2->iga_path) {			viaparinfo->lvds_setting_info2->h_active = hres;			viaparinfo->lvds_setting_info2->v_active = vres;			viaparinfo->lvds_setting_info2->bpp = bpp;			viaparinfo->lvds_setting_info2->refresh_rate =				vmode_refresh;		}	}}static void init_gfx_chip_info(void){	struct pci_dev *pdev = NULL;	u32 i;	u8 tmp;	/* Indentify GFX Chip Name */	for (i = 0; pciidlist[i].vendor != 0; i++) {		pdev = pci_get_device(pciidlist[i].vendor,			pciidlist[i].device, 0);		if (pdev)			break;	}	if (!pciidlist[i].vendor)		return ;	viaparinfo->chip_info->gfx_chip_name = pciidlist[i].chip_index;	/* Check revision of CLE266 Chip */	if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {		/* CR4F only define in CLE266.CX chip */		tmp = viafb_read_reg(VIACR, CR4F);		viafb_write_reg(CR4F, VIACR, 0x55);		if (viafb_read_reg(VIACR, CR4F) != 0x55)			viaparinfo->chip_info->gfx_chip_revision =			CLE266_REVISION_AX;		else			viaparinfo->chip_info->gfx_chip_revision =			CLE266_REVISION_CX;		/* restore orignal CR4F value */		viafb_write_reg(CR4F, VIACR, tmp);	}	if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CX700) {		tmp = viafb_read_reg(VIASR, SR43);		DEBUG_MSG(KERN_INFO "SR43:%X\n", tmp);		if (tmp & 0x02) {			viaparinfo->chip_info->gfx_chip_revision =				CX700_REVISION_700M2;		} else if (tmp & 0x40) {			viaparinfo->chip_info->gfx_chip_revision =				CX700_REVISION_700M;		} else {			viaparinfo->chip_info->gfx_chip_revision =				CX700_REVISION_700;		}	}	pci_dev_put(pdev);}static void init_tmds_chip_info(void){	viafb_tmds_trasmitter_identify();	if (INTERFACE_NONE == viaparinfo->chip_info->tmds_chip_info.		output_interface) {		switch (viaparinfo->chip_info->gfx_chip_name) {		case UNICHROME_CX700:			{				/* we should check support by hardware layout.*/				if ((viafb_display_hardware_layout ==				     HW_LAYOUT_DVI_ONLY)				    || (viafb_display_hardware_layout ==					HW_LAYOUT_LCD_DVI)) {					viaparinfo->chip_info->tmds_chip_info.					    output_interface = INTERFACE_TMDS;				} else {					viaparinfo->chip_info->tmds_chip_info.						output_interface =						INTERFACE_NONE;				}				break;			}		case UNICHROME_K8M890:		case UNICHROME_P4M900:		case UNICHROME_P4M890:			/* TMDS on PCIE, we set DFPLOW as default. */			viaparinfo->chip_info->tmds_chip_info.output_interface =			    INTERFACE_DFP_LOW;			break;		default:			{				/* set DVP1 default for DVI */				viaparinfo->chip_info->tmds_chip_info				.output_interface = INTERFACE_DVP1;			}		}	}	DEBUG_MSG(KERN_INFO "TMDS Chip = %d\n",		  viaparinfo->chip_info->tmds_chip_info.tmds_chip_name);	viaparinfo->tmds_setting_info->get_dvi_size_method =		GET_DVI_SIZE_BY_VGA_BIOS;	viafb_init_dvi_size();}static void init_lvds_chip_info(void){	if (viafb_lcd_panel_id > LCD_PANEL_ID_MAXIMUM)		viaparinfo->lvds_setting_info->get_lcd_size_method =		    GET_LCD_SIZE_BY_VGA_BIOS;	else		viaparinfo->lvds_setting_info->get_lcd_size_method =		    GET_LCD_SIZE_BY_USER_SETTING;	viafb_lvds_trasmitter_identify();	viafb_init_lcd_size();	viafb_init_lvds_output_interface(&viaparinfo->chip_info->lvds_chip_info,				   viaparinfo->lvds_setting_info);	if (viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name) {		viafb_init_lvds_output_interface(&viaparinfo->chip_info->			lvds_chip_info2, viaparinfo->lvds_setting_info2);	}	/*If CX700,two singel LCD, we need to reassign	   LCD interface to different LVDS port */	if ((UNICHROME_CX700 == viaparinfo->chip_info->gfx_chip_name)	    && (HW_LAYOUT_LCD1_LCD2 == viafb_display_hardware_layout)) {		if ((INTEGRATED_LVDS == viaparinfo->chip_info->lvds_chip_info.			lvds_chip_name) && (INTEGRATED_LVDS ==			viaparinfo->chip_info->			lvds_chip_info2.lvds_chip_name)) {			viaparinfo->chip_info->lvds_chip_info.output_interface =				INTERFACE_LVDS0;			viaparinfo->chip_info->lvds_chip_info2.				output_interface =			    INTERFACE_LVDS1;		}	}	DEBUG_MSG(KERN_INFO "LVDS Chip = %d\n",		  viaparinfo->chip_info->lvds_viaparinfo->chip_info->		  lvds_chip_name);	DEBUG_MSG(KERN_INFO "LVDS1 output_interface = %d\n",		  viaparinfo->chip_info->lvds_viaparinfo->chip_info->		  output_interface);	DEBUG_MSG(KERN_INFO "LVDS2 output_interface = %d\n",		  viaparinfo->chip_info->lvds_chip_info2.output_interface);}void viafb_init_dac(int set_iga){	int i;	u8 tmp;	if (set_iga == IGA1) {		/* access Primary Display's LUT */		viafb_write_reg_mask(SR1A, VIASR, 0x00, BI

⌨️ 快捷键说明

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