📄 hw.c
字号:
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 + -