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

📄 radeon.cpp

📁 ati driver
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************//	File:			Radeon.cpp//	Description:	ATI Radeon Graphics Chip interface.//	Copyright 2001, Carlos Hasan/*******************************************************************************/#include <unistd.h>#include <dirent.h>#include <Debug.h>#include <string.h>//#include "Driver.h"#include "Radeon.h"static const char * const C_RADEON_REGISTER_AREA_NAME = "RadeonRegisters";static const char * const C_RADEON_MEMORY_AREA_NAME = "RadeonMemory";static const char * const C_RADEON_ROM_AREA_NAME = "RadeonROM";// CRadeonRectCRadeonRect::CRadeonRect()	:	fLeft(0),		fTop(0),		fRight(0),		fBottom(0){}CRadeonRect::CRadeonRect(int left, int top, int right, int bottom)	:	fLeft(left),		fTop(top),		fRight(right),		fBottom(bottom){}int CRadeonRect::Left() const{	return fLeft;}int CRadeonRect::Top() const{	return fTop;}int CRadeonRect::Right() const{	return fRight;}int CRadeonRect::Bottom() const{	return fBottom;}int CRadeonRect::Width() const{	return fRight - fLeft + 1;}int CRadeonRect::Height() const{	return fBottom - fTop + 1;}void CRadeonRect::SetLeft(int value){	fLeft = value;}	void CRadeonRect::SetTop(int value){	fTop = value;}void CRadeonRect::SetRight(int value){	fRight = value;}void CRadeonRect::SetBottom(int value){	fBottom = value;}void CRadeonRect::SetTo(int left, int top, int right, int bottom){	fLeft = left;	fTop = top;	fRight = right;	fBottom = bottom;}void CRadeonRect::MoveTo(int left, int top){	fRight += left - fLeft;	fBottom += top - fTop;	fLeft += left - fLeft;	fTop += top - fTop;}void CRadeonRect::ResizeTo(int width, int height){	fRight = fLeft + width - 1;	fBottom = fTop + height - 1;}// CRadeonCRadeon::CRadeon( const char *dev_name )	:	fHandle(0),		fRegister(NULL),		fROM(NULL),		fVirtualCard(NULL),		fSharedInfo(NULL),		fRegisterArea(0),		fROMArea(0),		fVirtualCardArea(0),		fSharedInfoArea(0){	PRINT(("CRadeon::CRadeon()\n"));		if ((fHandle = open(dev_name, O_RDWR | O_CLOEXEC)) < 0) {		PRINT(("CRadeon::CRadeon() - Can't open kernel driver\n"));		return;	}	radeon_get_private_data gpd;		if (GetDeviceInformation(gpd) < B_OK) {		PRINT(("CRadeon::CRadeon() - Can't get device information\n"));		return;	}	CloneArea( 		"Radeon virtual card", gpd.virtual_card_area, 		&fVirtualCardArea, (void **)&fVirtualCard );	CloneArea( 		"Radeon shared info", gpd.shared_info_area, 		&fSharedInfoArea, (void **)&fSharedInfo );			if( fSharedInfo != NULL )  {		CloneArea(			"Radeon regs", fSharedInfo->regs_area, 			&fRegisterArea, (void **)&fRegister );		CloneArea(			"Radeon ROM", fSharedInfo->ROM_area, 			&fROMArea, (void **)&fROM );	}		if (fVirtualCard == NULL || fSharedInfo == NULL || 		fROM == NULL || fRegister == NULL) 	{		PRINT(("CRadeon::CRadeon() - Can't map memory apertures\n"));		return;	} 		PRINT(("CRadeon::CRadeon() - ATI Radeon found\n"));}CRadeon::~CRadeon(){	PRINT(("CRadeon::~CRadeon()\n"));	if( fVirtualCard != NULL )		delete_area( fVirtualCardArea );			if( fSharedInfo != NULL )		delete_area( fSharedInfoArea );			if (fRegister != NULL)		delete_area( fRegisterArea );			if (fROM != NULL)		delete_area( fROMArea );	if (fHandle >= 0)				close(fHandle);}status_t CRadeon::InitCheck() const{	return 		(fHandle >= 0 && 		fRegister != NULL && fROM != NULL &&		fVirtualCard != NULL && fSharedInfo != NULL) ? B_OK : B_ERROR;}uint32 CRadeon::VirtualMemoryBase() const{	return fSharedInfo->memory[mt_local].virtual_addr_start;}int CRadeon::Register(radeon_register index) const{	return fRegister[index >> 2];}void CRadeon::SetRegister(radeon_register index, int value){	fRegister[index >> 2] = value;}int CRadeon::Register(radeon_register index, int mask) const{	return fRegister[index >> 2] & mask;}void CRadeon::SetRegister(radeon_register index, int mask, int value){#ifdef DEBUG	if ((value & ~mask) != 0)		PRINT(("CRadeon::SetRegister(0x%04x, 0x%08x, 0x%08x)\n", index, mask, value));#endif	fRegister[index >> 2] = (fRegister[index >> 2] & ~mask) | (value & mask);}int CRadeon::VIPRegister(int device, int address){	radeon_vip_read vr;	status_t res;		vr.magic = RADEON_PRIVATE_DATA_MAGIC;	vr.channel = device;	vr.address = address;	vr.lock = true;		res = ioctl( fHandle, RADEON_VIPREAD, &vr, sizeof( vr ));		if( res == B_OK )		return vr.data;	else		return -1;}	void CRadeon::SetVIPRegister(int device, int address, int value){	radeon_vip_write vw;		vw.magic = RADEON_PRIVATE_DATA_MAGIC;	vw.channel = device;	vw.address = address;	vw.data = value;	vw.lock = true;		ioctl( fHandle, RADEON_VIPWRITE, &vw, sizeof( vw ));}int CRadeon::FindVIPDevice( uint32 device_id ){	radeon_find_vip_device fvd;	status_t res;		fvd.magic = RADEON_PRIVATE_DATA_MAGIC;	fvd.device_id = device_id;		res = ioctl( fHandle, RADEON_FINDVIPDEVICE, &fvd, sizeof( fvd ));		if( res == B_OK )		return fvd.channel;	else		return -1;}void CRadeon::GetPLLParameters(int & refFreq, int & refDiv, int & minFreq, int & maxFreq, int & xclock){	refFreq = fSharedInfo->pll.ref_freq;	refDiv = fSharedInfo->pll.ref_div;	minFreq = fSharedInfo->pll.min_pll_freq;	maxFreq = fSharedInfo->pll.max_pll_freq;	xclock = fSharedInfo->pll.xclk;}void CRadeon::GetMMParameters(radeon_video_tuner & tuner,							  radeon_video_decoder & video,							  radeon_video_clock & clock,							  int & tunerPort,							  int & compositePort,							  int & svideoPort){	unsigned char *fVideoBIOS = fROM + fROM[0x48] + (fROM[0x49] << 8);	unsigned char * fMMTable = fROM + fVideoBIOS[0x38] + (fVideoBIOS[0x39] << 8);	switch (fMMTable[0] & 0x1f) {	case 0x00:		tuner = C_RADEON_NO_TUNER;		break;	case 0x01:		tuner = C_RADEON_FI1236_MK1_NTSC;		break;	case 0x02:		tuner = C_RADEON_FI1236_MK2_NTSC_JAPAN;		break;	case 0x03:		tuner = C_RADEON_FI1216_MK2_PAL_BG;		break;	case 0x04:		tuner = C_RADEON_FI1246_MK2_PAL_I;		break;	case 0x05:		tuner = C_RADEON_FI1216_MF_MK2_PAL_BG_SECAM_L;		break;	case 0x06:		tuner = C_RADEON_FI1236_MK2_NTSC;		break;	case 0x07:		tuner = C_RADEON_FI1256_MK2_SECAM_DK;		break;	case 0x08:		tuner = C_RADEON_FI1236_MK2_NTSC;		break;	case 0x09:		tuner = C_RADEON_FI1216_MK2_PAL_BG;		break;	case 0x0a:		tuner = C_RADEON_FI1246_MK2_PAL_I;		break;	case 0x0b:		tuner = C_RADEON_FI1216_MK2_PAL_BG_SECAM_L;		break;	case 0x0c:		tuner = C_RADEON_FI1236_MK2_NTSC;		break;	case 0x0d:		tuner = C_RADEON_TEMIC_FN5AL_PAL_IBGDK_SECAM_DK;		break;	default:		tuner = C_RADEON_NO_TUNER;		break;	}		switch (fMMTable[5] & 0x0f) {	case 0x00:		video = C_RADEON_NO_VIDEO;		break;	case 0x01:		video = C_RADEON_BT819;		break;	case 0x02:		video = C_RADEON_BT829;		break;	case 0x03:		video = C_RADEON_BT829A;		break;	case 0x04:		video = C_RADEON_SA7111;		break;	case 0x05:		video = C_RADEON_SA7112;		break;	case 0x06:		video = C_RADEON_RAGE_THEATER;		break;	default:		video = C_RADEON_NO_VIDEO;		break;	}		switch (fMMTable[5] & 0xf0) {	case 0x00:	case 0x10:	case 0x20:	case 0x30:		clock = C_RADEON_NO_VIDEO_CLOCK;		break;	case 0x40:		clock = C_RADEON_VIDEO_CLOCK_28_63636_MHZ;		break;	case 0x50:		clock = C_RADEON_VIDEO_CLOCK_29_49892_MHZ;		break;	case 0x60:		clock = C_RADEON_VIDEO_CLOCK_27_00000_MHZ;		break;	case 0x70:		clock = C_RADEON_VIDEO_CLOCK_14_31818_MHZ;		break;	default:		clock = C_RADEON_NO_VIDEO_CLOCK;		break;	}	for (int port = 0; port < 4; port++) {			switch (fMMTable[7 + port] & 0x03) {		case 0x00:			// Unused or Invalid			break;		case 0x01:			// Tuner Input			tunerPort = 0;			break;		case 0x02:			// Front/Rear Composite Input			compositePort = (fMMTable[7 + port] & 0x04 ? 2 : 1);			break;		case 0x03:			// Front/Rear SVideo Input			svideoPort = (fMMTable[7 + port] & 0x04 ? 6 : 5);			break;		}	}}status_t CRadeon::AllocateGraphicsMemory( 	memory_type_e memory_type, int32 size,	int32 *offset, int32 *handle ){	radeon_alloc_mem am;	status_t res;		am.magic = RADEON_PRIVATE_DATA_MAGIC;	am.size = size;	am.memory_type = mt_local;	am.global = false;		res = ioctl( fHandle, RADEON_ALLOC_MEM, &am );		if( res != B_OK )		return res;			*handle = am.handle;	*offset = am.offset;	return B_OK;}		void CRadeon::FreeGraphicsMemory( 	memory_type_e memory_type, int32 handle ){	radeon_free_mem fm;		fm.magic = RADEON_PRIVATE_DATA_MAGIC;	fm.memory_type = memory_type;	fm.global = false;	fm.handle = handle;	ioctl( fHandle, RADEON_FREE_MEM, &fm );}status_t CRadeon::DMACopy( 	uint32 src, void *target, size_t size, bool lock_mem, bool contiguous ){	radeon_dma_copy dc;		dc.magic = RADEON_PRIVATE_DATA_MAGIC;	dc.src = src;	dc.target = target;	dc.size = size;

⌨️ 快捷键说明

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