📄 radeon_vid.c
字号:
/* * * radeon_vid.c * * Copyright (C) 2001 Nick Kurshev * * BES YUV video overlay driver for Radeon/Rage128Pro/Rage128 cards * * This software has been released under the terms of the GNU Public * license. See http://www.gnu.org/copyleft/gpl.html for details. * * This file is partly based on mga_vid and sis_vid stuff from * mplayer's package. * Also here was used code from CVS of GATOS project and X11 trees. * * SPECIAL THANKS TO: Hans-Peter Raschke for active testing and hacking * Rage128(pro) stuff of this driver. */#define RADEON_VID_VERSION "1.2.1"/* It's entirely possible this major conflicts with something else mknod /dev/radeon_vid c 178 0 or mknod /dev/rage128_vid c 178 0 for Rage128/Rage128Pro chips (although it doesn't matter) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TESTED and WORKING formats: YUY2, UYVY, IYUV, I420, YV12 ----------------------------------------------------------- TODO: Highest priority: fbvid.h compatibility High priority: Fixing BUGS Middle priority: RGB/BGR 2-32, YVU9, IF09 support Low priority: CLPL, IYU1, IYU2, UYNV, CYUV, YUNV, YVYU, Y41P, Y211, Y41T, ^^^^ Y42T, V422, V655, CLJR, YUVP, UYVP, Mpeg PES (mpeg-1,2) support ........................................................... BUGS and LACKS: Color and video keys don't work*/#include <linux/config.h>#include <linux/version.h>#include <linux/module.h>#include <linux/types.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/mm.h>#include <linux/string.h>#include <linux/errno.h>#include <linux/slab.h>#include <linux/pci.h>#include <linux/ioport.h>#include <linux/init.h>#include <linux/byteorder/swab.h>#include "radeon_vid.h"#include "radeon.h"#ifdef CONFIG_MTRR #include <asm/mtrr.h>#endif#include <asm/uaccess.h>#include <asm/system.h>#include <asm/io.h>#define TRUE 1#define FALSE 0#define RADEON_VID_MAJOR 178MODULE_AUTHOR("Nick Kurshev <nickols_k@mail.ru>");#ifdef RAGE128MODULE_DESCRIPTION("Accelerated YUV BES driver for Rage128. Version: "RADEON_VID_VERSION);#elseMODULE_DESCRIPTION("Accelerated YUV BES driver for Radeons. Version: "RADEON_VID_VERSION);#endif#ifdef MODULE_LICENSEMODULE_LICENSE("GPL");#endif#ifdef CONFIG_MTRR MODULE_PARM(mtrr, "i");MODULE_PARM_DESC(mtrr, "Tune MTRR (touch=1(default))");static int mtrr __initdata = 1;static struct { int vram; int vram_valid; } smtrr;#endifMODULE_PARM(swap_fourcc, "i");MODULE_PARM_DESC(swap_fourcc, "Swap fourcc (don't swap=0(default))");static int swap_fourcc __initdata = 0;#ifdef RAGE128#define RVID_MSG "rage128_vid: "#define X_ADJUST 0#else#define RVID_MSG "radeon_vid: "#define X_ADJUST 8#ifndef RADEON#define RADEON#endif#endif#undef DEBUG#if DEBUG#define RTRACE printk#else#define RTRACE(...) ((void)0)#endif#ifndef min#define min(a,b) (a < b ? a : b)#endif#ifndef RAGE128#if defined(__i386__)/* Ugly but only way */#undef AVOID_FPUstatic double inline __FastSin(double x) { register double res; __asm __volatile("fsin":"=t"(res):"0"(x)); return res;}#undef sin#define sin(x) __FastSin(x)static double inline __FastCos(double x) { register double res; __asm __volatile("fcos":"=t"(res):"0"(x)); return res;}#undef cos#define cos(x) __FastCos(x)#else#include "generic_math.h"#endif /*__386__*/#endif /*RAGE128*/#if !defined( RAGE128 ) && !defined( AVOID_FPU )#define RADEON_FPU 1#endiftypedef struct bes_registers_s{ /* base address of yuv framebuffer */ uint32_t yuv_base; uint32_t fourcc; uint32_t dest_bpp; /* YUV BES registers */ uint32_t reg_load_cntl; uint32_t h_inc; uint32_t step_by; uint32_t y_x_start; uint32_t y_x_end; uint32_t v_inc; uint32_t p1_blank_lines_at_top; uint32_t p23_blank_lines_at_top; uint32_t vid_buf_pitch0_value; uint32_t vid_buf_pitch1_value; uint32_t p1_x_start_end; uint32_t p2_x_start_end; uint32_t p3_x_start_end; uint32_t base_addr; uint32_t vid_buf0_base_adrs; /* These ones are for auto flip: maybe in the future */ uint32_t vid_buf1_base_adrs; uint32_t vid_buf2_base_adrs; uint32_t vid_buf3_base_adrs; uint32_t vid_buf4_base_adrs; uint32_t vid_buf5_base_adrs; uint32_t p1_v_accum_init; uint32_t p1_h_accum_init; uint32_t p23_v_accum_init; uint32_t p23_h_accum_init; uint32_t scale_cntl; uint32_t exclusive_horz; uint32_t auto_flip_cntl; uint32_t filter_cntl; uint32_t key_cntl; uint32_t test; /* Configurable stuff */ int double_buff; int brightness; int saturation; int ckey_on; uint32_t graphics_key_clr; uint32_t graphics_key_msk; int deinterlace_on; uint32_t deinterlace_pattern; } bes_registers_t;typedef struct video_registers_s{#ifdef DEBUG const char * sname;#endif uint32_t name; uint32_t value;}video_registers_t;static bes_registers_t besr;#ifndef RAGE128static int IsR200=0;#endif#ifdef DEBUG#define DECLARE_VREG(name) { #name, name, 0 }#else#define DECLARE_VREG(name) { name, 0 }#endif#ifdef DEBUGstatic video_registers_t vregs[] = { DECLARE_VREG(VIDEOMUX_CNTL), DECLARE_VREG(VIPPAD_MASK), DECLARE_VREG(VIPPAD1_A), DECLARE_VREG(VIPPAD1_EN), DECLARE_VREG(VIPPAD1_Y), DECLARE_VREG(OV0_Y_X_START), DECLARE_VREG(OV0_Y_X_END), DECLARE_VREG(OV0_PIPELINE_CNTL), DECLARE_VREG(OV0_EXCLUSIVE_HORZ), DECLARE_VREG(OV0_EXCLUSIVE_VERT), DECLARE_VREG(OV0_REG_LOAD_CNTL), DECLARE_VREG(OV0_SCALE_CNTL), DECLARE_VREG(OV0_V_INC), DECLARE_VREG(OV0_P1_V_ACCUM_INIT), DECLARE_VREG(OV0_P23_V_ACCUM_INIT), DECLARE_VREG(OV0_P1_BLANK_LINES_AT_TOP), DECLARE_VREG(OV0_P23_BLANK_LINES_AT_TOP),#ifdef RADEON DECLARE_VREG(OV0_BASE_ADDR),#endif DECLARE_VREG(OV0_VID_BUF0_BASE_ADRS), DECLARE_VREG(OV0_VID_BUF1_BASE_ADRS), DECLARE_VREG(OV0_VID_BUF2_BASE_ADRS), DECLARE_VREG(OV0_VID_BUF3_BASE_ADRS), DECLARE_VREG(OV0_VID_BUF4_BASE_ADRS), DECLARE_VREG(OV0_VID_BUF5_BASE_ADRS), DECLARE_VREG(OV0_VID_BUF_PITCH0_VALUE), DECLARE_VREG(OV0_VID_BUF_PITCH1_VALUE), DECLARE_VREG(OV0_AUTO_FLIP_CNTL), DECLARE_VREG(OV0_DEINTERLACE_PATTERN), DECLARE_VREG(OV0_SUBMIT_HISTORY), DECLARE_VREG(OV0_H_INC), DECLARE_VREG(OV0_STEP_BY), DECLARE_VREG(OV0_P1_H_ACCUM_INIT), DECLARE_VREG(OV0_P23_H_ACCUM_INIT), DECLARE_VREG(OV0_P1_X_START_END), DECLARE_VREG(OV0_P2_X_START_END), DECLARE_VREG(OV0_P3_X_START_END), DECLARE_VREG(OV0_FILTER_CNTL), DECLARE_VREG(OV0_FOUR_TAP_COEF_0), DECLARE_VREG(OV0_FOUR_TAP_COEF_1), DECLARE_VREG(OV0_FOUR_TAP_COEF_2), DECLARE_VREG(OV0_FOUR_TAP_COEF_3), DECLARE_VREG(OV0_FOUR_TAP_COEF_4), DECLARE_VREG(OV0_FLAG_CNTL),#ifdef RAGE128 DECLARE_VREG(OV0_COLOUR_CNTL),#else DECLARE_VREG(OV0_SLICE_CNTL),#endif DECLARE_VREG(OV0_VID_KEY_CLR), DECLARE_VREG(OV0_VID_KEY_MSK), DECLARE_VREG(OV0_GRAPHICS_KEY_CLR), DECLARE_VREG(OV0_GRAPHICS_KEY_MSK), DECLARE_VREG(OV0_KEY_CNTL), DECLARE_VREG(OV0_TEST), DECLARE_VREG(OV0_LIN_TRANS_A), DECLARE_VREG(OV0_LIN_TRANS_B), DECLARE_VREG(OV0_LIN_TRANS_C), DECLARE_VREG(OV0_LIN_TRANS_D), DECLARE_VREG(OV0_LIN_TRANS_E), DECLARE_VREG(OV0_LIN_TRANS_F), DECLARE_VREG(OV0_GAMMA_0_F), DECLARE_VREG(OV0_GAMMA_10_1F), DECLARE_VREG(OV0_GAMMA_20_3F), DECLARE_VREG(OV0_GAMMA_40_7F), DECLARE_VREG(OV0_GAMMA_380_3BF), DECLARE_VREG(OV0_GAMMA_3C0_3FF), DECLARE_VREG(SUBPIC_CNTL), DECLARE_VREG(SUBPIC_DEFCOLCON), DECLARE_VREG(SUBPIC_Y_X_START), DECLARE_VREG(SUBPIC_Y_X_END), DECLARE_VREG(SUBPIC_V_INC), DECLARE_VREG(SUBPIC_H_INC), DECLARE_VREG(SUBPIC_BUF0_OFFSET), DECLARE_VREG(SUBPIC_BUF1_OFFSET), DECLARE_VREG(SUBPIC_LC0_OFFSET), DECLARE_VREG(SUBPIC_LC1_OFFSET), DECLARE_VREG(SUBPIC_PITCH), DECLARE_VREG(SUBPIC_BTN_HLI_COLCON), DECLARE_VREG(SUBPIC_BTN_HLI_Y_X_START), DECLARE_VREG(SUBPIC_BTN_HLI_Y_X_END), DECLARE_VREG(SUBPIC_PALETTE_INDEX), DECLARE_VREG(SUBPIC_PALETTE_DATA), DECLARE_VREG(SUBPIC_H_ACCUM_INIT), DECLARE_VREG(SUBPIC_V_ACCUM_INIT), DECLARE_VREG(IDCT_RUNS), DECLARE_VREG(IDCT_LEVELS), DECLARE_VREG(IDCT_AUTH_CONTROL), DECLARE_VREG(IDCT_AUTH), DECLARE_VREG(IDCT_CONTROL)};#endifstatic uint32_t radeon_vid_in_use = 0;static uint8_t *radeon_mmio_base = 0;static uint32_t radeon_mem_base = 0; static int32_t radeon_overlay_off = 0;static uint32_t radeon_ram_size = 0;#define PARAM_BUFF_SIZE 4096static uint8_t *radeon_param_buff = NULL;static uint32_t radeon_param_buff_size=0;static uint32_t radeon_param_buff_len=0; /* real length of buffer */static mga_vid_config_t radeon_config; static char *fourcc_format_name(int format){ switch(format) { case IMGFMT_RGB8: return("RGB 8-bit"); case IMGFMT_RGB15: return("RGB 15-bit"); case IMGFMT_RGB16: return("RGB 16-bit"); case IMGFMT_RGB24: return("RGB 24-bit"); case IMGFMT_RGB32: return("RGB 32-bit"); case IMGFMT_BGR8: return("BGR 8-bit"); case IMGFMT_BGR15: return("BGR 15-bit"); case IMGFMT_BGR16: return("BGR 16-bit"); case IMGFMT_BGR24: return("BGR 24-bit"); case IMGFMT_BGR32: return("BGR 32-bit"); case IMGFMT_YVU9: return("Planar YVU9"); case IMGFMT_IF09: return("Planar IF09"); case IMGFMT_YV12: return("Planar YV12"); case IMGFMT_I420: return("Planar I420"); case IMGFMT_IYUV: return("Planar IYUV"); case IMGFMT_CLPL: return("Planar CLPL"); case IMGFMT_Y800: return("Planar Y800"); case IMGFMT_Y8: return("Planar Y8"); case IMGFMT_IUYV: return("Packed IUYV"); case IMGFMT_IY41: return("Packed IY41"); case IMGFMT_IYU1: return("Packed IYU1"); case IMGFMT_IYU2: return("Packed IYU2"); case IMGFMT_UYNV: return("Packed UYNV"); case IMGFMT_cyuv: return("Packed CYUV"); case IMGFMT_Y422: return("Packed Y422"); case IMGFMT_YUY2: return("Packed YUY2"); case IMGFMT_YUNV: return("Packed YUNV"); case IMGFMT_UYVY: return("Packed UYVY");// case IMGFMT_YVYU: return("Packed YVYU"); case IMGFMT_Y41P: return("Packed Y41P"); case IMGFMT_Y211: return("Packed Y211"); case IMGFMT_Y41T: return("Packed Y41T"); case IMGFMT_Y42T: return("Packed Y42T"); case IMGFMT_V422: return("Packed V422"); case IMGFMT_V655: return("Packed V655"); case IMGFMT_CLJR: return("Packed CLJR"); case IMGFMT_YUVP: return("Packed YUVP"); case IMGFMT_UYVP: return("Packed UYVP"); case IMGFMT_MPEGPES: return("Mpeg PES"); } return("Unknown");}/* * IO macros */#define INREG8(addr) readb((radeon_mmio_base)+addr)#define OUTREG8(addr,val) writeb(val, (radeon_mmio_base)+addr)#define INREG(addr) readl((radeon_mmio_base)+addr)#define OUTREG(addr,val) writel(val, (radeon_mmio_base)+addr)#define OUTREGP(addr,val,mask) \ do { \ unsigned int _tmp = INREG(addr); \ _tmp &= (mask); \ _tmp |= (val); \ OUTREG(addr, _tmp); \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -