radeon_vid.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 2,049 行 · 第 1/5 页
C
2,049 行
{ DEVICE_ATI_RV280_RADEON_92006, R_280 }, { DEVICE_ATI_RV280_RADEON_92007, R_280 }, { DEVICE_ATI_M9_5C61_RADEON, R_280 }, { DEVICE_ATI_M9_5C63_RADEON, R_280 },/* Radeon3 (indeed: Rage 1024 Pro ;) */ { DEVICE_ATI_R300_AG_FIREGL, R_300 }, { DEVICE_ATI_RADEON_R300_ND, R_300 }, { DEVICE_ATI_RADEON_R300_NE, R_300 }, { DEVICE_ATI_RADEON_R300_NG, R_300 }, { DEVICE_ATI_R300_AD_RADEON, R_300 }, { DEVICE_ATI_R300_AE_RADEON, R_300 }, { DEVICE_ATI_R300_AF_RADEON, R_300 }, { DEVICE_ATI_RADEON_9100_IGP2, R_300|R_OVL_SHIFT|R_INTEGRATED }, { DEVICE_ATI_RS300M_AGP_RADEON, R_300|R_INTEGRATED }, { DEVICE_ATI_RS482_RADEON_XPRESS, R_350|R_INTEGRATED }, { DEVICE_ATI_R350_AH_RADEON, R_350 }, { DEVICE_ATI_R350_AI_RADEON, R_350 }, { DEVICE_ATI_R350_AJ_RADEON, R_350 }, { DEVICE_ATI_R350_AK_FIRE, R_350 }, { DEVICE_ATI_RADEON_R350_RADEON2, R_350 }, { DEVICE_ATI_RADEON_R350_RADEON3, R_350 }, { DEVICE_ATI_RV350_NJ_RADEON, R_350 }, { DEVICE_ATI_R350_NK_FIRE, R_350 }, { DEVICE_ATI_RV350_AP_RADEON, R_350 }, { DEVICE_ATI_RV350_AQ_RADEON, R_350 }, { DEVICE_ATI_RV350_AR_RADEON, R_350 }, { DEVICE_ATI_RV350_AS_RADEON, R_350 }, { DEVICE_ATI_RV350_AT_FIRE, R_350 }, { DEVICE_ATI_RV350_AU_FIRE, R_350 }, { DEVICE_ATI_RV350_AV_FIRE, R_350 }, { DEVICE_ATI_RV350_AW_FIRE, R_350 }, { DEVICE_ATI_RV350_MOBILITY_RADEON, R_350 }, { DEVICE_ATI_RV350_NF_RADEON, R_300 }, { DEVICE_ATI_RV350_NJ_RADEON, R_300 }, { DEVICE_ATI_RV350_AS_RADEON2, R_350 }, { DEVICE_ATI_M10_NQ_RADEON, R_350 }, { DEVICE_ATI_M10_NQ_RADEON2, R_350 }, { DEVICE_ATI_RV350_MOBILITY_RADEON2, R_350 }, { DEVICE_ATI_M10_NS_RADEON, R_350 }, { DEVICE_ATI_M10_NT_FIREGL, R_350 }, { DEVICE_ATI_M11_NV_FIREGL, R_350 }, { DEVICE_ATI_RV370_5B60_RADEON, R_370|R_PCIE }, { DEVICE_ATI_RV370_SAPPHIRE_X550, R_370 }, { DEVICE_ATI_RV370_5B64_FIREGL, R_370|R_PCIE }, { DEVICE_ATI_RV370_5B65_FIREGL, R_370|R_PCIE }, { DEVICE_ATI_M24_1P_RADEON, R_370 }, { DEVICE_ATI_M22_RADEON_MOBILITY, R_370 }, { DEVICE_ATI_M24_1T_FIREGL, R_370 }, { DEVICE_ATI_M24_RADEON_MOBILITY, R_370 }, { DEVICE_ATI_RV370_RADEON_X300SE, R_370 }, { DEVICE_ATI_RV370_SECONDARY_SAPPHIRE, R_370 }, { DEVICE_ATI_RV370_5B64_FIREGL2, R_370 }, { DEVICE_ATI_RV380_0X3E50_RADEON, R_380|R_PCIE }, { DEVICE_ATI_RV380_0X3E54_FIREGL, R_380|R_PCIE }, { DEVICE_ATI_RV380_RADEON_X600, R_380|R_PCIE }, { DEVICE_ATI_RV380_RADEON_X6002, R_380 }, { DEVICE_ATI_RV380_RADEON_X6003, R_380 }, { DEVICE_ATI_RV410_FIREGL_V5000, R_420 }, { DEVICE_ATI_RV410_FIREGL_V3300, R_420 }, { DEVICE_ATI_RV410_RADEON_X700XT, R_420 }, { DEVICE_ATI_RV410_RADEON_X700, R_420|R_PCIE }, { DEVICE_ATI_RV410_RADEON_X700SE, R_420 }, { DEVICE_ATI_RV410_RADEON_X7002, R_420|R_PCIE }, { DEVICE_ATI_RV410_RADEON_X7003, R_420 }, { DEVICE_ATI_RV410_RADEON_X7004, R_420|R_PCIE }, { DEVICE_ATI_RV410_RADEON_X7005, R_420|R_PCIE }, { DEVICE_ATI_M26_MOBILITY_FIREGL, R_420 }, { DEVICE_ATI_M26_MOBILITY_FIREGL2, R_420 }, { DEVICE_ATI_M26_RADEON_MOBILITY, R_420 }, { DEVICE_ATI_M26_RADEON_MOBILITY2, R_420 }, { DEVICE_ATI_RADEON_MOBILITY_X700, R_420 }, { DEVICE_ATI_R420_JH_RADEON, R_420|R_PCIE }, { DEVICE_ATI_R420_JI_RADEON, R_420|R_PCIE }, { DEVICE_ATI_R420_JJ_RADEON, R_420|R_PCIE }, { DEVICE_ATI_R420_JK_RADEON, R_420|R_PCIE }, { DEVICE_ATI_R420_JL_RADEON, R_420|R_PCIE }, { DEVICE_ATI_R420_JM_FIREGL, R_420|R_PCIE }, { DEVICE_ATI_M18_JN_RADEON, R_420|R_PCIE }, { DEVICE_ATI_R420_JP_RADEON, R_420|R_PCIE }, { DEVICE_ATI_R420_RADEON_X800, R_420|R_PCIE }, { DEVICE_ATI_R420_RADEON_X8002, R_420|R_PCIE }, { DEVICE_ATI_R420_RADEON_X8003, R_420|R_PCIE }, { DEVICE_ATI_R420_RADEON_X8004, R_420|R_PCIE }, { DEVICE_ATI_R420_RADEON_X8005, R_420|R_PCIE }, { DEVICE_ATI_R420_JM_FIREGL, R_420|R_PCIE }, { DEVICE_ATI_R423_5F57_RADEON, R_420|R_PCIE }, { DEVICE_ATI_R423_5F57_RADEON2, R_420|R_PCIE }, { DEVICE_ATI_R423_UH_RADEON, R_420|R_PCIE }, { DEVICE_ATI_R423_UI_RADEON, R_420|R_PCIE }, { DEVICE_ATI_R423_UJ_RADEON, R_420|R_PCIE }, { DEVICE_ATI_R423_UK_RADEON, R_420|R_PCIE }, { DEVICE_ATI_R423_FIRE_GL, R_420|R_PCIE }, { DEVICE_ATI_R423_UQ_FIREGL, R_420|R_PCIE }, { DEVICE_ATI_R423_UR_FIREGL, R_420|R_PCIE }, { DEVICE_ATI_R423_UT_FIREGL, R_420|R_PCIE }, { DEVICE_ATI_R423_UI_RADEON2, R_420|R_PCIE }, { DEVICE_ATI_R423GL_SE_ATI_FIREGL, R_420|R_PCIE }, { DEVICE_ATI_R423_RADEON_X800XT, R_420|R_PCIE }, { DEVICE_ATI_RADEON_R423_UK, R_420|R_PCIE }, { DEVICE_ATI_M28_RADEON_MOBILITY, R_420 }, { DEVICE_ATI_M28_MOBILITY_FIREGL, R_420 }, { DEVICE_ATI_MOBILITY_RADEON_X800, R_420 }, { DEVICE_ATI_R430_RADEON_X800, R_430|R_PCIE }, { DEVICE_ATI_R430_RADEON_X8002, R_430|R_PCIE }, { DEVICE_ATI_R430_RADEON_X8003, R_430|R_PCIE }, { DEVICE_ATI_R430_RADEON_X8004, R_430|R_PCIE }, { DEVICE_ATI_R480_RADEON_X800, R_480 }, { DEVICE_ATI_R480_RADEON_X8002, R_480 }, { DEVICE_ATI_R480_RADEON_X850XT, R_480 }, { DEVICE_ATI_R480_RADEON_X850PRO, R_480 }, { DEVICE_ATI_R481_RADEON_X850XT_PE, R_480|R_PCIE }, { DEVICE_ATI_R480_RADEON_X850XT2, R_480 }, { DEVICE_ATI_R480_RADEON_X850PRO2, R_480 }, { DEVICE_ATI_R481_RADEON_X850XT_PE2, R_480|R_PCIE }, { DEVICE_ATI_R480_RADEON_X850XT3, R_480|R_PCIE }, { DEVICE_ATI_R480_RADEON_X850XT4, R_480|R_PCIE }, { DEVICE_ATI_R480_RADEON_X850XT5, R_480|R_PCIE }, { DEVICE_ATI_R480_RADEON_X850XT6, R_480|R_PCIE }, { DEVICE_ATI_R520_FIREGL, R_520 }, { DEVICE_ATI_R520_GL_ATI, R_520 }, { DEVICE_ATI_R520_GL_ATI2, R_520 }, { DEVICE_ATI_R520_RADEON_X1800, R_520 }, { DEVICE_ATI_R520_RADEON_X18002, R_520 }, { DEVICE_ATI_R520_RADEON_X18003, R_520 }, { DEVICE_ATI_R520_RADEON_X18004, R_520 }, { DEVICE_ATI_R520_RADEON_X18005, R_520 }, { DEVICE_ATI_R520_RADEON_X18006, R_520 }, { DEVICE_ATI_R520_RADEON_X18007, R_520 }, { DEVICE_ATI_M58_RADEON_MOBILITY, R_520 }, { DEVICE_ATI_M58_RADEON_MOBILITY2, R_520 }, { DEVICE_ATI_M58_MOBILITY_FIREGL, R_520 }, { DEVICE_ATI_M58_MOBILITY_FIREGL2, R_520 }, { DEVICE_ATI_RV515_RADEON_X1600, R_520 }, { DEVICE_ATI_RV515_RADEON_X1300, R_520 }, { DEVICE_ATI_RV515_RADEON_X13002, R_520 }, { DEVICE_ATI_RV515_RADEON_X13003, R_520 }, { DEVICE_ATI_RV515_RADEON_X13004, R_520 }, { DEVICE_ATI_RV515_RADEON_X13005, R_520 }, { DEVICE_ATI_RV515_RADEON_X13006, R_520 }, { DEVICE_ATI_RV515_RADEON_X13007, R_520 }, { DEVICE_ATI_RV515_GL_ATI, R_520 }, { DEVICE_ATI_RV515_GL_ATI2, R_520 }, { DEVICE_ATI_RADEON_MOBILITY_X1400, R_520 }, { DEVICE_ATI_M52_ATI_MOBILITY, R_520 }, { DEVICE_ATI_M52_ATI_MOBILITY2, R_520 }, { DEVICE_ATI_M52_ATI_MOBILITY3, R_520 }, { DEVICE_ATI_M52_ATI_MOBILITY4, R_520 }, { DEVICE_ATI_RV516_RADEON_X1300, R_520 }, { DEVICE_ATI_RV516_RADEON_X13002, R_520 }, { DEVICE_ATI_RV516_XT_RADEON, R_520 }, { DEVICE_ATI_RV516_XT_RADEON2, R_520 }, { DEVICE_ATI_RV530_RADEON_X1600, R_520 }, { DEVICE_ATI_RV530_RADEON_X16002, R_520 }, { DEVICE_ATI_M56GL_ATI_MOBILITY, R_520 }, { DEVICE_ATI_M56P_RADEON_MOBILITY, R_520 }, { DEVICE_ATI_M66_P_ATI_MOBILITY, R_520 }, { DEVICE_ATI_M66_XT_ATI_MOBILITY, R_520 }, { DEVICE_ATI_RV530LE_RADEON_X1600, R_520 }, { DEVICE_ATI_RV530LE_RADEON_X16002, R_520 }, { DEVICE_ATI_RV530LE_RADEON_X16003, R_520 }, { DEVICE_ATI_RV530_RADEON_X16003, R_520 }, { DEVICE_ATI_RV530_RADEON_X16004, R_520 }, { DEVICE_ATI_R580_RADEON_X1900, R_520 }, { DEVICE_ATI_R580_RADEON_X19002, R_520 }, { DEVICE_ATI_R580_RADEON_X19003, R_520 }, { DEVICE_ATI_R580_RADEON_X19004, R_520 }, { DEVICE_ATI_R580_RADEON_X19005, R_520 }, { DEVICE_ATI_R580_RADEON_X19006, R_520 }, { DEVICE_ATI_R580_RADEON_X19007, R_520 }, { DEVICE_ATI_R580_RADEON_X19008, R_520 }, { DEVICE_ATI_R580_RADEON_X19009, R_520 }, { DEVICE_ATI_R580_RADEON_X190010, R_520 }, { DEVICE_ATI_R580_RADEON_X190011, R_520 }, { DEVICE_ATI_R580_RADEON_X190012, R_520 }, { DEVICE_ATI_R580_RADEON_X190013, R_520 }, { DEVICE_ATI_R580_RADEON_X190014, R_520 }, { DEVICE_ATI_R580_RADEON_X190015, R_520 }, { DEVICE_ATI_R580_FIREGL_V7300_V7350, R_520 }, { DEVICE_ATI_R580_FIREGL_V7300_V73502, R_520 },#endif};static void * radeon_mmio_base = 0;static void * radeon_mem_base = 0; static int32_t radeon_overlay_off = 0;static uint32_t radeon_ram_size = 0;#define GETREG(TYPE,PTR,OFFZ) (*((volatile TYPE*)((PTR)+(OFFZ))))#define SETREG(TYPE,PTR,OFFZ,VAL) (*((volatile TYPE*)((PTR)+(OFFZ))))=VAL#define INREG8(addr) GETREG(uint8_t,(uint8_t *)(radeon_mmio_base),addr)#define OUTREG8(addr,val) SETREG(uint8_t,(uint8_t *)(radeon_mmio_base),addr,val)static inline uint32_t INREG (uint32_t addr) { uint32_t tmp = GETREG(uint32_t,(uint8_t *)(radeon_mmio_base),addr); return le2me_32(tmp);}#define OUTREG(addr,val) SETREG(uint32_t,(uint8_t *)(radeon_mmio_base),addr,le2me_32(val))#define OUTREGP(addr,val,mask) \ do { \ unsigned int _tmp = INREG(addr); \ _tmp &= (mask); \ _tmp |= (val); \ OUTREG(addr, _tmp); \ } while (0)static __inline__ uint32_t INPLL(uint32_t addr){ OUTREG8(CLOCK_CNTL_INDEX, addr & 0x0000001f); return (INREG(CLOCK_CNTL_DATA));}#define OUTPLL(addr,val) OUTREG8(CLOCK_CNTL_INDEX, (addr & 0x0000001f) | 0x00000080); \ OUTREG(CLOCK_CNTL_DATA, val)#define OUTPLLP(addr,val,mask) \ do { \ unsigned int _tmp = INPLL(addr); \ _tmp &= (mask); \ _tmp |= (val); \ OUTPLL(addr, _tmp); \ } while (0)#ifndef RAGE128enum radeon_montype{ MT_NONE, MT_CRT, /* CRT-(cathode ray tube) analog monitor. (15-pin VGA connector) */ MT_LCD, /* Liquid Crystal Display */ MT_DFP, /* DFP-digital flat panel monitor. (24-pin DVI-I connector) */ MT_CTV, /* Composite TV out (not in VE) */ MT_STV /* S-Video TV out (probably in VE only) */};typedef struct radeon_info_s{ int hasCRTC2; int crtDispType; int dviDispType;}rinfo_t;static rinfo_t rinfo;static char * GET_MON_NAME(int type){ char *pret; switch(type) { case MT_NONE: pret = "no"; break; case MT_CRT: pret = "CRT"; break; case MT_DFP: pret = "DFP"; break; case MT_LCD: pret = "LCD"; break; case MT_CTV: pret = "CTV"; break; case MT_STV: pret = "STV"; break; default: pret = "Unknown"; } return pret;}static void radeon_get_moninfo (rinfo_t *rinfo){ unsigned int tmp; tmp = INREG(RADEON_BIOS_4_SCRATCH); if (rinfo->hasCRTC2) { /* primary DVI port */ if (tmp & 0x08) rinfo->dviDispType = MT_DFP; else if (tmp & 0x4) rinfo->dviDispType = MT_LCD; else if (tmp & 0x200) rinfo->dviDispType = MT_CRT; else if (tmp & 0x10) rinfo->dviDispType = MT_CTV; else if (tmp & 0x20) rinfo->dviDispType = MT_STV; /* secondary CRT port */ if (tmp & 0x2) rinfo->crtDispType = MT_CRT; else if (tmp & 0x800) rinfo->crtDispType = MT_DFP; else if (tmp & 0x400) rinfo->crtDispType = MT_LCD; else if (tmp & 0x1000) rinfo->crtDispType = MT_CTV; else if (tmp & 0x2000) rinfo->crtDispType = MT_STV; } else { rinfo->dviDispType = MT_NONE; tmp = INREG(FP_GEN_CNTL); if (tmp & FP_EN_TMDS) rinfo->crtDispType = MT_DFP; else rinfo->crtDispType = MT_CRT; }}#endifstatic uint32_t radeon_vid_get_dbpp( void ){ uint32_t dbpp,retval; dbpp = (INREG(CRTC_GEN_CNTL)>>8)& 0xF; switch(dbpp) { case DST_8BPP: retval = 8; break; case DST_15BPP: retval = 15; break; case DST_16BPP: retval = 16; break; case DST_24BPP: retval = 24; break; default: retval=32; break; } return retval;}static int radeon_is_dbl_scan( void ){ return (INREG(CRTC_GEN_CNTL))&CRTC_DBL_SCAN_EN;}static int radeon_is_interlace( void ){ return (INREG(CRTC_GEN_CNTL))&CRTC_INTERLACE_EN;}static uint32_t radeon_get_xres( void ){ uint32_t xres,h_total;#ifndef RAGE128 if(rinfo.hasCRTC2 && (rinfo.dviDispType == MT_CTV || rinfo.dviDispType == MT_STV)) h_total = INREG(CRTC2_H_TOTAL_DISP); else#endif h_total = INREG(CRTC_H_TOTAL_DISP); xres = (h_total >> 16) & 0xffff; return (xres + 1)*8;}static uint32_t radeon_get_yres( void ){ uint32_t yres,v_total;#ifndef RAGE128 if(rinfo.hasCRTC2 && (rinfo.dviDispType == MT_CTV || rinfo.dviDispType == MT_STV)) v_total = INREG(CRTC2_V_TOTAL_DISP); else#endif v_total = INREG(CRTC_V_TOTAL_DISP); yres = (v_total >> 16) & 0xffff; return yres + 1;}static void radeon_wait_vsync(void){ int i; OUTREG(GEN_INT_STATUS, VSYNC_INT_AK); for (i = 0; i < 2000000; i++) { if (INREG(GEN_INT_STATUS) & VSYNC_INT) break; }}#ifdef RAGE128static void _radeon_engine_idle(void);static void _radeon_fifo_wait(unsigned);#define radeon_engine_idle() _radeon_engine_idle()#define radeon_fifo_wait(entries) _radeon_fifo_wait(entries)/* Flush all dirty data in the Pixel Cache to memory. */static __inline__ void radeon_engine_flush ( void ){ unsigned i; OUTREGP(PC_NGUI_CTLSTAT, PC_FLUSH_ALL, ~PC_FLUSH_ALL); for (i = 0; i < 2000000; i++) { if (!(INREG(PC_NGUI_CTLSTAT) & PC_BUSY)) break; }}/* Reset graphics card to known state. */static void radeon_engine_reset( void ){ uint32_t clock_cntl_index; uint32_t mclk_cntl; uint32_t gen_reset_cntl; radeon_engine_flush(); clock_cntl_index = INREG(CLOCK_CNTL_INDEX); mclk_cntl = INPLL(MCLK_CNTL); OUTPLL(MCLK_CNTL, mclk_cntl | FORCE_GCP | FORCE_PIPE3D_CP); gen_reset_cntl = INREG(GEN_RESET_CNTL); OUTREG(GEN_RESET_CNTL, gen_reset_cntl | SOFT_RESET_GUI); INREG(GEN_RESET_CNTL); OUTREG(GEN_RESET_CNTL, gen_reset_cntl & (uint32_t)(~SOFT_RESET_GUI)); INREG(GEN_RESET_CNTL); OUTPLL(MCLK_CNTL, mclk_cntl); OUTREG(CLOCK_CNTL_INDEX, clock_cntl_index); OUTREG(GEN_RESET_CNTL, gen_reset_cntl);}#elsestatic __inline__ void radeon_engine_flush ( void )
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?