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

📄 hw.c

📁 via framebuffer driver
💻 C
📖 第 1 页 / 共 5 页
字号:
								     0x10,								     0x00},	/* Index 0xC0~0xC3 */	{0x00, 0x10, 0x00}, {0x00, 0x10, 0x04}, {0x00, 0x10, 0x08}, {0x00,								     0x10,								     0x0C},	/* Index 0xC4~0xC7 */	{0x00, 0x10, 0x10}, {0x00, 0x0C, 0x10}, {0x00, 0x08, 0x10}, {0x00,								     0x04,								     0x10},	/* Index 0xC8~0xCB */	{0x08, 0x08, 0x10}, {0x0A, 0x08, 0x10}, {0x0C, 0x08, 0x10}, {0x0E,								     0x08,								     0x10},	/* Index 0xCC~0xCF */	{0x10, 0x08, 0x10}, {0x10, 0x08, 0x0E}, {0x10, 0x08, 0x0C}, {0x10,								     0x08,								     0x0A},	/* Index 0xD0~0xD3 */	{0x10, 0x08, 0x08}, {0x10, 0x0A, 0x08}, {0x10, 0x0C, 0x08}, {0x10,								     0x0E,								     0x08},	/* Index 0xD4~0xD7 */	{0x10, 0x10, 0x08}, {0x0E, 0x10, 0x08}, {0x0C, 0x10, 0x08}, {0x0A,								     0x10,								     0x08},	/* Index 0xD8~0xDB */	{0x08, 0x10, 0x08}, {0x08, 0x10, 0x0A}, {0x08, 0x10, 0x0C}, {0x08,								     0x10,								     0x0E},	/* Index 0xDC~0xDF */	{0x08, 0x10, 0x10}, {0x08, 0x0E, 0x10}, {0x08, 0x0C, 0x10}, {0x08,								     0x0A,								     0x10},	/* Index 0xE0~0xE3 */	{0x0B, 0x0B, 0x10}, {0x0C, 0x0B, 0x10}, {0x0D, 0x0B, 0x10}, {0x0F,								     0x0B,								     0x10},	/* Index 0xE4~0xE7 */	{0x10, 0x0B, 0x10}, {0x10, 0x0B, 0x0F}, {0x10, 0x0B, 0x0D}, {0x10,								     0x0B,								     0x0C},	/* Index 0xE8~0xEB */	{0x10, 0x0B, 0x0B}, {0x10, 0x0C, 0x0B}, {0x10, 0x0D, 0x0B}, {0x10,								     0x0F,								     0x0B},	/* Index 0xEC~0xEF */	{0x10, 0x10, 0x0B}, {0x0F, 0x10, 0x0B}, {0x0D, 0x10, 0x0B}, {0x0C,								     0x10,								     0x0B},	/* Index 0xF0~0xF3 */	{0x0B, 0x10, 0x0B}, {0x0B, 0x10, 0x0C}, {0x0B, 0x10, 0x0D}, {0x0B,								     0x10,								     0x0F},	/* Index 0xF4~0xF7 */	{0x0B, 0x10, 0x10}, {0x0B, 0x0F, 0x10}, {0x0B, 0x0D, 0x10}, {0x0B,								     0x0C,								     0x10},	/* Index 0xF8~0xFB */	{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00,								     0x00,								     0x00},	/* Index 0xFC~0xFF */	{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x00,								     0x00,								     0x00}};static void set_crt_output_path(int set_iga);static void dvi_patch_skew_dvp0(void);static void dvi_patch_skew_dvp1(void);static void dvi_patch_skew_dvp_low(void);static void set_dvi_output_path(int set_iga, int output_interface);static void set_lcd_output_path(int set_iga, int output_interface);static int search_mode_setting(int ModeInfoIndex);static void load_fix_bit_crtc_reg(void);static void init_gfx_chip_info(void);static void init_tmds_chip_info(void);static void init_lvds_chip_info(void);static void device_screen_off(void);static void device_screen_on(void);static void set_display_channel(void);static void device_off(void);static void device_on(void);static void enable_second_display_channel(void);static void disable_second_display_channel(void);static int get_fb_size_from_pci(void);void viafb_write_reg(u8 index, u16 io_port, u8 data){	outb(index, io_port);	outb(data, io_port + 1);	/*DEBUG_MSG(KERN_INFO "\nIndex=%2d Value=%2d", index, data); */}u8 viafb_read_reg(int io_port, u8 index){	outb(index, io_port);	return (inb(io_port + 1));}void viafb_lock_crt(void){	viafb_write_reg_mask(CR11, VIACR, BIT7, BIT7);}void viafb_unlock_crt(void){	viafb_write_reg_mask(CR11, VIACR, 0, BIT7);	viafb_write_reg_mask(CR47, VIACR, 0, BIT0);}void viafb_write_reg_mask(u8 index, int io_port, u8 data, u8 mask){	u8 tmp;	outb(index, io_port);	tmp = inb(io_port + 1);	outb((data & mask) | (tmp & (~mask)), io_port + 1);	/*DEBUG_MSG(KERN_INFO "\nIndex=%2d Value=%2d", index, tmp); */}void write_dac_reg(u8 index, u8 r, u8 g, u8 b){	outb(index, LUT_INDEX_WRITE);	outb(r, LUT_DATA);	outb(g, LUT_DATA);	outb(b, LUT_DATA);}/*Set IGA path for each device*/void viafb_set_iga_path(void){	if (viafb_SAMM_ON == 1) {		if (viafb_CRT_ON) {			if (viafb_primary_dev == CRT_Device) {				viaparinfo->crt_setting_info->iga_path = IGA1;			} else {				viaparinfo->crt_setting_info->iga_path = IGA2;			}		}		if (viafb_DVI_ON) {			if (viafb_primary_dev == DVI_Device) {				viaparinfo->tmds_setting_info->iga_path = IGA1;			} else {				viaparinfo->tmds_setting_info->iga_path = IGA2;			}		}		if (viafb_LCD_ON) {			if (viafb_primary_dev == LCD_Device) {				if (viafb_dual_fb &&					(viaparinfo->chip_info->gfx_chip_name ==					UNICHROME_CLE266)) {					viaparinfo->					lvds_setting_info->iga_path = IGA2;					viaparinfo->					crt_setting_info->iga_path = IGA1;					viaparinfo->					tmds_setting_info->iga_path = IGA1;				} else					viaparinfo->					lvds_setting_info->iga_path = IGA1;			} else {				viaparinfo->lvds_setting_info->iga_path = IGA2;			}		}		if (viafb_LCD2_ON) {			if (LCD2_Device == viafb_primary_dev) {				viaparinfo->lvds_setting_info2->iga_path = IGA1;			} else {				viaparinfo->lvds_setting_info2->iga_path = IGA2;			}		}	} else {		viafb_SAMM_ON = 0;		if (viafb_CRT_ON && viafb_LCD_ON) {			viaparinfo->crt_setting_info->iga_path = IGA1;			viaparinfo->lvds_setting_info->iga_path = IGA2;		} else if (viafb_CRT_ON && viafb_DVI_ON) {			viaparinfo->crt_setting_info->iga_path = IGA1;			viaparinfo->tmds_setting_info->iga_path = IGA2;		} else if (viafb_LCD_ON && viafb_DVI_ON) {			viaparinfo->tmds_setting_info->iga_path = IGA1;			viaparinfo->lvds_setting_info->iga_path = IGA2;		} else if (viafb_LCD_ON && viafb_LCD2_ON) {			viaparinfo->lvds_setting_info->iga_path = IGA2;			viaparinfo->lvds_setting_info2->iga_path = IGA2;		} else if (viafb_CRT_ON) {			viaparinfo->crt_setting_info->iga_path = IGA1;		} else if (viafb_LCD_ON) {			viaparinfo->lvds_setting_info->iga_path = IGA2;		} else if (viafb_DVI_ON) {			viaparinfo->tmds_setting_info->iga_path = IGA1;		}	}}void viafb_set_start_addr(void){	unsigned long offset = 0, tmp = 0, size = 0;	unsigned long length;	DEBUG_MSG(KERN_INFO "viafb_set_start_addr!\n");	viafb_unlock_crt();	/* update starting address of IGA1 */	viafb_write_reg(CR0C, VIACR, 0x00);	/*initial starting address */	viafb_write_reg(CR0D, VIACR, 0x00);	viafb_write_reg(CR34, VIACR, 0x00);	viafb_write_reg_mask(CR48, VIACR, 0x00, 0x1F);	if (viafb_dual_fb) {		viaparinfo->iga_path = IGA1;		viaparinfo1->iga_path = IGA2;	}	if (viafb_SAMM_ON == 1) {		if (!viafb_dual_fb) {			if (viafb_second_size) {				size = viafb_second_size * 1024 * 1024;			} else {				size = 8 * 1024 * 1024;			}		} else {			size = viaparinfo1->memsize;		}		offset = viafb_second_offset;		DEBUG_MSG(KERN_INFO			  "viafb_second_size=%lx, second start_adddress=%lx\n",			  size, offset);	}	if (viafb_SAMM_ON == 1) {		offset = offset >> 3;		tmp = viafb_read_reg(VIACR, 0x62) & 0x01;		tmp |= (offset & 0x7F) << 1;		viafb_write_reg(CR62, VIACR, tmp);		viafb_write_reg(CR63, VIACR, ((offset & 0x7F80) >> 7));		viafb_write_reg(CR64, VIACR, ((offset & 0x7F8000) >> 15));		viafb_write_reg(CRA3, VIACR, ((offset & 0x3800000) >> 23));	} else {		/* update starting address */		viafb_write_reg(CR62, VIACR, 0x00);		viafb_write_reg(CR63, VIACR, 0x00);		viafb_write_reg(CR64, VIACR, 0x00);		viafb_write_reg(CRA3, VIACR, 0x00);	}	if (viafb_SAMM_ON == 1) {		if (via_fb_accel) {			if (!viafb_dual_fb)				length = size - viaparinfo->fbmem_used;			else				length = size - viaparinfo1->fbmem_used;		} else			length = size;		offset = (unsigned long)(void *)viafb_FB_MM +			viafb_second_offset;		memset((void *)offset, 0, length);	}	viafb_lock_crt();}void viafb_set_output_path(int device, int set_iga, int output_interface){	switch (device) {	case DEVICE_CRT:		set_crt_output_path(set_iga);		break;	case DEVICE_DVI:		set_dvi_output_path(set_iga, output_interface);		break;	case DEVICE_LCD:		set_lcd_output_path(set_iga, output_interface);		break;	}}static void set_crt_output_path(int set_iga){	viafb_write_reg_mask(CR36, VIACR, 0x00, BIT4 + BIT5);	switch (set_iga) {	case IGA1:		viafb_write_reg_mask(SR16, VIASR, 0x00, BIT6);		break;	case IGA2:	case IGA1_IGA2:		viafb_write_reg_mask(CR6A, VIACR, 0xC0, BIT6 + BIT7);		viafb_write_reg_mask(SR16, VIASR, 0x40, BIT6);		if (set_iga == IGA1_IGA2)			viafb_write_reg_mask(CR6B, VIACR, 0x08, BIT3);		break;	}}static void dvi_patch_skew_dvp0(void){	/* Reset data driving first: */	viafb_write_reg_mask(SR1B, VIASR, 0, BIT1);	viafb_write_reg_mask(SR2A, VIASR, 0, BIT4);	switch (viaparinfo->chip_info->gfx_chip_name) {	case UNICHROME_P4M890:		{			if ((viaparinfo->tmds_setting_info->h_active == 1600) &&				(viaparinfo->tmds_setting_info->v_active ==				1200))				viafb_write_reg_mask(CR96, VIACR, 0x03,					       BIT0 + BIT1 + BIT2);			else				viafb_write_reg_mask(CR96, VIACR, 0x07,					       BIT0 + BIT1 + BIT2);			break;		}	case UNICHROME_P4M900:		{			viafb_write_reg_mask(CR96, VIACR, 0x07,				       BIT0 + BIT1 + BIT2 + BIT3);			viafb_write_reg_mask(SR1B, VIASR, 0x02, BIT1);			viafb_write_reg_mask(SR2A, VIASR, 0x10, BIT4);			break;		}	default:		{			break;		}	}}static void dvi_patch_skew_dvp1(void){	switch (viaparinfo->chip_info->gfx_chip_name) {	case UNICHROME_CX700:		{			break;		}	default:		{			break;		}	}}static void dvi_patch_skew_dvp_low(void){	switch (viaparinfo->chip_info->gfx_chip_name) {	case UNICHROME_K8M890:		{			viafb_write_reg_mask(CR99, VIACR, 0x03, BIT0 + BIT1);			break;		}	case UNICHROME_P4M900:		{			viafb_write_reg_mask(CR99, VIACR, 0x08,				       BIT0 + BIT1 + BIT2 + BIT3);			break;		}	case UNICHROME_P4M890:		{			viafb_write_reg_mask(CR99, VIACR, 0x0F,				       BIT0 + BIT1 + BIT2 + BIT3);			break;		}	default:		{			break;		}	}}static void set_dvi_output_path(int set_iga, int output_interface){	switch (output_interface) {	case INTERFACE_DVP0:		viafb_write_reg_mask(CR6B, VIACR, 0x01, BIT0);		if (set_iga == IGA1) {			viafb_write_reg_mask(CR96, VIACR, 0x00, BIT4);			viafb_write_reg_mask(CR6C, VIACR, 0x21, BIT0 +				BIT5 + BIT7);		} else {			viafb_write_reg_mask(CR96, VIACR, 0x10, BIT4);			viafb_write_reg_mask(CR6C, VIACR, 0xA1, BIT0 +				BIT5 + BIT7);		}		viafb_write_reg_mask(SR1E, VIASR, 0xC0, BIT7 + BIT6);		dvi_patch_skew_dvp0();		break;	case INTERFACE_DVP1:		if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) {			if (set_iga == IGA1)				viafb_write_reg_mask(CR93, VIACR, 0x21,					       BIT0 + BIT5 + BIT7);			else				viafb_write_reg_mask(CR93, VIACR, 0xA1,					       BIT0 + BIT5 + BIT7);		} else {			if (set_iga == IGA1)				viafb_write_reg_mask(CR9B, VIACR, 0x00, BIT4);			else				viafb_write_reg_mask(CR9B, VIACR, 0x10, BIT4);		}		viafb_write_reg_mask(SR1E, VIASR, 0x30, BIT4 + BIT5);		dvi_patch_skew_dvp1();		break;	case INTERFACE_DFP_HIGH:		if (viaparinfo->chip_info->gfx_chip_name != UNICHROME_CLE266) {			if (set_iga == IGA1) {				viafb_write_reg_mask(CR96, VIACR, 0x00, BIT4);				viafb_write_reg_mask(CR97, VIACR, 0x03,					       BIT0 + BIT1 + BIT4);			} else {				viafb_write_reg_mask(CR96, VIACR, 0x10, BIT4);				viafb_write_reg_mask(CR97, VIACR, 0x13,					       BIT0 + BIT1 + BIT4);			}		}		viafb_write_reg_mask(SR2A, VIASR, 0x0C, BIT2 + BIT3);		break;

⌨️ 快捷键说明

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