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

📄 radeon_vid.c

📁 君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图片解码,浏览,电子书,录音,想学ucos,识货的人就下吧 russblock fmradio explore set
💻 C
📖 第 1 页 / 共 4 页
字号:
	} while (0)static 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 __inline__ void radeon_engine_flush ( void ){	int i;	/* initiate flush */	OUTREGP(RB2D_DSTCACHE_CTLSTAT, RB2D_DC_FLUSH_ALL,	        ~RB2D_DC_FLUSH_ALL);	for (i=0; i < 2000000; i++) {		if (!(INREG(RB2D_DSTCACHE_CTLSTAT) & RB2D_DC_BUSY))			break;	}}static __inline__ void _radeon_fifo_wait (int entries){	int i;	for (i=0; i<2000000; i++)		if ((INREG(RBBM_STATUS) & 0x7f) >= entries)			return;}static __inline__ void _radeon_engine_idle ( void ){	int i;	/* ensure FIFO is empty before waiting for idle */	_radeon_fifo_wait (64);	for (i=0; i<2000000; i++) {		if (((INREG(RBBM_STATUS) & GUI_ACTIVE)) == 0) {			radeon_engine_flush ();			return;		}	}}#define radeon_engine_idle()		_radeon_engine_idle()#define radeon_fifo_wait(entries)	_radeon_fifo_wait(entries)#if 0static void __init radeon_vid_save_state( void ){  size_t i;  for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++)	vregs[i].value = INREG(vregs[i].name);}static void __exit radeon_vid_restore_state( void ){  size_t i;  radeon_fifo_wait(2);  OUTREG(OV0_REG_LOAD_CNTL,		REG_LD_CTL_LOCK);  radeon_engine_idle();  while(!(INREG(OV0_REG_LOAD_CNTL)&REG_LD_CTL_LOCK_READBACK));  radeon_fifo_wait(15);  for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++)  {	radeon_fifo_wait(1);	OUTREG(vregs[i].name,vregs[i].value);  }  OUTREG(OV0_REG_LOAD_CNTL,		0);}#endif#ifdef DEBUGstatic void radeon_vid_dump_regs( void ){  size_t i;  printk(RVID_MSG"*** Begin of OV0 registers dump ***\n");  for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++)	printk(RVID_MSG"%s = %08X\n",vregs[i].sname,INREG(vregs[i].name));  printk(RVID_MSG"*** End of OV0 registers dump ***\n");}#endif#ifdef RADEON_FPU/* Reference color space transform data */typedef struct tagREF_TRANSFORM{	float RefLuma;	float RefRCb;	float RefRCr;	float RefGCb;	float RefGCr;	float RefBCb;	float RefBCr;} REF_TRANSFORM;/* Parameters for ITU-R BT.601 and ITU-R BT.709 colour spaces */REF_TRANSFORM trans[2] ={	{1.1678, 0.0, 1.6007, -0.3929, -0.8154, 2.0232, 0.0}, /* BT.601 */	{1.1678, 0.0, 1.7980, -0.2139, -0.5345, 2.1186, 0.0}  /* BT.709 */};/**************************************************************************** * SetTransform                                                             * *  Function: Calculates and sets color space transform from supplied       * *            reference transform, gamma, brightness, contrast, hue and     * *            saturation.                                                   * *    Inputs: bright - brightness                                           * *            cont - contrast                                               * *            sat - saturation                                              * *            hue - hue                                                     * *            ref - index to the table of refernce transforms               * *   Outputs: NONE                                                          * ****************************************************************************/static void radeon_set_transform(float bright, float cont, float sat,				 float hue, unsigned ref){	float OvHueSin, OvHueCos;	float CAdjLuma, CAdjOff;	float CAdjRCb, CAdjRCr;	float CAdjGCb, CAdjGCr;	float CAdjBCb, CAdjBCr;	float OvLuma, OvROff, OvGOff, OvBOff;	float OvRCb, OvRCr;	float OvGCb, OvGCr;	float OvBCb, OvBCr;	float Loff = 64.0;	float Coff = 512.0f;	u32 dwOvLuma, dwOvROff, dwOvGOff, dwOvBOff;	u32 dwOvRCb, dwOvRCr;	u32 dwOvGCb, dwOvGCr;	u32 dwOvBCb, dwOvBCr;	if (ref >= 2) return;	OvHueSin = sin((double)hue);	OvHueCos = cos((double)hue);	CAdjLuma = cont * trans[ref].RefLuma;	CAdjOff = cont * trans[ref].RefLuma * bright * 1023.0;	CAdjRCb = sat * -OvHueSin * trans[ref].RefRCr;	CAdjRCr = sat * OvHueCos * trans[ref].RefRCr;	CAdjGCb = sat * (OvHueCos * trans[ref].RefGCb - OvHueSin * trans[ref].RefGCr);	CAdjGCr = sat * (OvHueSin * trans[ref].RefGCb + OvHueCos * trans[ref].RefGCr);	CAdjBCb = sat * OvHueCos * trans[ref].RefBCb;	CAdjBCr = sat * OvHueSin * trans[ref].RefBCb;    #if 0 /* default constants */        CAdjLuma = 1.16455078125;	CAdjRCb = 0.0;	CAdjRCr = 1.59619140625;	CAdjGCb = -0.39111328125;	CAdjGCr = -0.8125;	CAdjBCb = 2.01708984375;	CAdjBCr = 0;#endif	OvLuma = CAdjLuma;	OvRCb = CAdjRCb;	OvRCr = CAdjRCr;	OvGCb = CAdjGCb;	OvGCr = CAdjGCr;	OvBCb = CAdjBCb;	OvBCr = CAdjBCr;	OvROff = CAdjOff -		OvLuma * Loff - (OvRCb + OvRCr) * Coff;	OvGOff = CAdjOff - 		OvLuma * Loff - (OvGCb + OvGCr) * Coff;	OvBOff = CAdjOff - 		OvLuma * Loff - (OvBCb + OvBCr) * Coff;#if 0 /* default constants */	OvROff = -888.5;	OvGOff = 545;	OvBOff = -1104;#endif    	dwOvROff = ((int)(OvROff * 2.0)) & 0x1fff;	dwOvGOff = (int)(OvGOff * 2.0) & 0x1fff;	dwOvBOff = (int)(OvBOff * 2.0) & 0x1fff;	if(!IsR200)	{		dwOvLuma =(((int)(OvLuma * 2048.0))&0x7fff)<<17;		dwOvRCb = (((int)(OvRCb * 2048.0))&0x7fff)<<1;		dwOvRCr = (((int)(OvRCr * 2048.0))&0x7fff)<<17;		dwOvGCb = (((int)(OvGCb * 2048.0))&0x7fff)<<1;		dwOvGCr = (((int)(OvGCr * 2048.0))&0x7fff)<<17;		dwOvBCb = (((int)(OvBCb * 2048.0))&0x7fff)<<1;		dwOvBCr = (((int)(OvBCr * 2048.0))&0x7fff)<<17;	}	else	{		dwOvLuma = (((int)(OvLuma * 256.0))&0x7ff)<<20;		dwOvRCb = (((int)(OvRCb * 256.0))&0x7ff)<<4;		dwOvRCr = (((int)(OvRCr * 256.0))&0x7ff)<<20;		dwOvGCb = (((int)(OvGCb * 256.0))&0x7ff)<<4;		dwOvGCr = (((int)(OvGCr * 256.0))&0x7ff)<<20;		dwOvBCb = (((int)(OvBCb * 256.0))&0x7ff)<<4;		dwOvBCr = (((int)(OvBCr * 256.0))&0x7ff)<<20;	}	OUTREG(OV0_LIN_TRANS_A, dwOvRCb | dwOvLuma);	OUTREG(OV0_LIN_TRANS_B, dwOvROff | dwOvRCr);	OUTREG(OV0_LIN_TRANS_C, dwOvGCb | dwOvLuma);	OUTREG(OV0_LIN_TRANS_D, dwOvGOff | dwOvGCr);	OUTREG(OV0_LIN_TRANS_E, dwOvBCb | dwOvLuma);	OUTREG(OV0_LIN_TRANS_F, dwOvBOff | dwOvBCr);}#endif#ifndef RAGE128/* Gamma curve definition */typedef struct {	unsigned int gammaReg;	unsigned int gammaSlope;	unsigned int gammaOffset;}GAMMA_SETTINGS;/* Recommended gamma curve parameters */GAMMA_SETTINGS r200_def_gamma[18] = {	{OV0_GAMMA_0_F, 0x100, 0x0000},	{OV0_GAMMA_10_1F, 0x100, 0x0020},	{OV0_GAMMA_20_3F, 0x100, 0x0040},	{OV0_GAMMA_40_7F, 0x100, 0x0080},	{OV0_GAMMA_80_BF, 0x100, 0x0100},	{OV0_GAMMA_C0_FF, 0x100, 0x0100},	{OV0_GAMMA_100_13F, 0x100, 0x0200},	{OV0_GAMMA_140_17F, 0x100, 0x0200},	{OV0_GAMMA_180_1BF, 0x100, 0x0300},	{OV0_GAMMA_1C0_1FF, 0x100, 0x0300},	{OV0_GAMMA_200_23F, 0x100, 0x0400},	{OV0_GAMMA_240_27F, 0x100, 0x0400},	{OV0_GAMMA_280_2BF, 0x100, 0x0500},	{OV0_GAMMA_2C0_2FF, 0x100, 0x0500},	{OV0_GAMMA_300_33F, 0x100, 0x0600},	{OV0_GAMMA_340_37F, 0x100, 0x0600},	{OV0_GAMMA_380_3BF, 0x100, 0x0700},	{OV0_GAMMA_3C0_3FF, 0x100, 0x0700}};GAMMA_SETTINGS r100_def_gamma[6] = {	{OV0_GAMMA_0_F, 0x100, 0x0000},	{OV0_GAMMA_10_1F, 0x100, 0x0020},	{OV0_GAMMA_20_3F, 0x100, 0x0040},	{OV0_GAMMA_40_7F, 0x100, 0x0080},	{OV0_GAMMA_380_3BF, 0x100, 0x0100},	{OV0_GAMMA_3C0_3FF, 0x100, 0x0100}};static void make_default_gamma_correction( void ){    size_t i;    if(!IsR200){	OUTREG(OV0_LIN_TRANS_A, 0x12A00000);	OUTREG(OV0_LIN_TRANS_B, 0x199018FE);	OUTREG(OV0_LIN_TRANS_C, 0x12A0F9B0);	OUTREG(OV0_LIN_TRANS_D, 0xF2F0043B);	OUTREG(OV0_LIN_TRANS_E, 0x12A02050);	OUTREG(OV0_LIN_TRANS_F, 0x0000174E);	for(i=0; i<6; i++){		OUTREG(r100_def_gamma[i].gammaReg,		       (r100_def_gamma[i].gammaSlope<<16) |		        r100_def_gamma[i].gammaOffset);	}    }    else{	OUTREG(OV0_LIN_TRANS_A, 0x12a00000);	OUTREG(OV0_LIN_TRANS_B, 0x1990190e);	OUTREG(OV0_LIN_TRANS_C, 0x12a0f9c0);	OUTREG(OV0_LIN_TRANS_D, 0xf3000442);	OUTREG(OV0_LIN_TRANS_E, 0x12a02040);	OUTREG(OV0_LIN_TRANS_F, 0x175f);	/* Default Gamma,	   Of 18 segments for gamma cure, all segments in R200 are programmable,	   while only lower 4 and upper 2 segments are programmable in Radeon*/	for(i=0; i<18; i++){		OUTREG(r200_def_gamma[i].gammaReg,		       (r200_def_gamma[i].gammaSlope<<16) |		        r200_def_gamma[i].gammaOffset);	}    }}#endifstatic void radeon_vid_stop_video( void ){    radeon_engine_idle();    OUTREG(OV0_SCALE_CNTL, SCALER_SOFT_RESET);    OUTREG(OV0_EXCLUSIVE_HORZ, 0);    OUTREG(OV0_AUTO_FLIP_CNTL, 0);   /* maybe */    OUTREG(OV0_FILTER_CNTL, FILTER_HARDCODED_COEF);    OUTREG(OV0_KEY_CNTL, GRAPHIC_KEY_FN_NE);    OUTREG(OV0_TEST, 0);}static void radeon_vid_display_video( void ){    int bes_flags;    radeon_fifo_wait(2);    OUTREG(OV0_REG_LOAD_CNTL,		REG_LD_CTL_LOCK);    radeon_engine_idle();    while(!(INREG(OV0_REG_LOAD_CNTL)&REG_LD_CTL_LOCK_READBACK));    radeon_fifo_wait(15);    OUTREG(OV0_AUTO_FLIP_CNTL,OV0_AUTO_FLIP_CNTL_SOFT_BUF_ODD);    OUTREG(OV0_AUTO_FLIP_CNTL,(INREG(OV0_AUTO_FLIP_CNTL)^OV0_AUTO_FLIP_CNTL_SOFT_EOF_TOGGLE));    OUTREG(OV0_AUTO_FLIP_CNTL,(INREG(OV0_AUTO_FLIP_CNTL)^OV0_AUTO_FLIP_CNTL_SOFT_EOF_TOGGLE));    OUTREG(OV0_DEINTERLACE_PATTERN,besr.deinterlace_pattern);#ifdef RAGE128    OUTREG(OV0_COLOUR_CNTL, (besr.brightness & 0x7f) |			    (besr.saturation << 8) |			    (besr.saturation << 16));#endif    radeon_fifo_wait(2);    if(besr.ckey_on)    {	OUTREG(OV0_GRAPHICS_KEY_MSK, besr.graphics_key_msk);	OUTREG(OV0_GRAPHICS_KEY_CLR, besr.graphics_key_clr);	OUTREG(OV0_KEY_CNTL,GRAPHIC_KEY_FN_EQ|VIDEO_KEY_FN_FALSE|CMP_MIX_OR);    }    else    {	OUTREG(OV0_GRAPHICS_KEY_MSK, 0ULL);	OUTREG(OV0_GRAPHICS_KEY_CLR, 0ULL);	OUTREG(OV0_KEY_CNTL,GRAPHIC_KEY_FN_NE);    }    OUTREG(OV0_H_INC,			besr.h_inc);    OUTREG(OV0_STEP_BY,			besr.step_by);    OUTREG(OV0_Y_X_START,		besr.y_x_start);    OUTREG(OV0_Y_X_END,			besr.y_x_end);    OUTREG(OV0_V_INC,			besr.v_inc);    OUTREG(OV0_P1_BLANK_LINES_AT_TOP,	besr.p1_blank_lines_at_top);    OUTREG(OV0_P23_BLANK_LINES_AT_TOP,	besr.p23_blank_lines_at_top);    OUTREG(OV0_VID_BUF_PITCH0_VALUE,	besr.vid_buf_pitch0_value);    OUTREG(OV0_VID_BUF_PITCH1_VALUE,	besr.vid_buf_pitch1_value);    OUTREG(OV0_P1_X_START_END,		besr.p1_x_start_end);    OUTREG(OV0_P2_X_START_END,		besr.p2_x_start_end);    OUTREG(OV0_P3_X_START_END,		besr.p3_x_start_end);#ifdef RADEON    OUTREG(OV0_BASE_ADDR,		besr.base_addr);#endif    OUTREG(OV0_VID_BUF0_BASE_ADRS,	besr.vid_buf0_base_adrs);    OUTREG(OV0_VID_BUF1_BASE_ADRS,	besr.vid_buf1_base_adrs);    OUTREG(OV0_VID_BUF2_BASE_ADRS,	besr.vid_buf2_base_adrs);    radeon_fifo_wait(9);    OUTREG(OV0_VID_BUF3_BASE_ADRS,	besr.vid_buf3_base_adrs);    OUTREG(OV0_VID_BUF4_BASE_ADRS,	besr.vid_buf4_base_adrs);    OUTREG(OV0_VID_BUF5_BASE_ADRS,	besr.vid_buf5_base_adrs);    OUTREG(OV0_P1_V_ACCUM_INIT,		besr.p1_v_accum_init);    OUTREG(OV0_P1_H_ACCUM_INIT,		besr.p1_h_accum_init);    OUTREG(OV0_P23_H_ACCUM_INIT,	besr.p23_h_accum_init);    OUTREG(OV0_P23_V_ACCUM_INIT,	besr.p23_v_accum_init);#ifdef RADEON    bes_flags = SCALER_ENABLE |                SCALER_SMART_SWITCH;//		SCALER_HORZ_PICK_NEAREST;#else

⌨️ 快捷键说明

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