cnovbase.c

来自「这是一个SIGMA方案的PMP播放器的UCLINUX程序,可播放DVD,VCD,」· C语言 代码 · 共 234 行

C
234
字号
/******************************************************************************//*  cnovabase.c : Implementation of the AnalogOverlay interface*  REALmagic Quasar Hardware Library*  Created by Aurelia Popa-Radu*  Copyright Sigma Designs Inc*  Sigma Designs Proprietary and confidential*  Created on 8/27/99*  Description:/******************************************************************************//****h* HwLib/IAnalogOverlay_implementation * NAME *	IAnalogOverlay_implementation * DESCRIPTION *  CNova_implementation and CNovaLite_implementation describe the implementation *  of IAnalogOverlay interface. *	Some common access procedures are described next. * COPYRIGHT *  Copyright Sigma Designs Inc *  Sigma Designs Proprietary and confidential/******************************************************************************/#include "pch.h"#if defined NOVA_OBJECT || defined NOVALITE_OBJECT#include "ci2c.h"#include "cnovbase.h"void CNovaBase__SSCK(IAnalogOverlay* pIAnalogOverlay, BOOL clock){	CNovaBase *this = (CNovaBase*) pIAnalogOverlay ;	if(clock)		ISetI2CpIO_WrClock(this->pISetI2CpIO, this->m_dwClock1);	else		ISetI2CpIO_WrClock(this->pISetI2CpIO, this->m_dwClock0);	// It seems to work without delay in SSDA but needs delay in SSCK	OSTimeDelay(1);	// The delay is too long but is not system dependent					// this "1us" delay is taking between 6.55us - 9.88us on my Pentium 300MHz}void CNovaBase__SSDA(IAnalogOverlay* pIAnalogOverlay, BOOL data){	CNovaBase *this = (CNovaBase*) pIAnalogOverlay ;	if(data)		ISetI2CpIO_WrData(this->pISetI2CpIO, this->m_dwData1);	else		ISetI2CpIO_WrData(this->pISetI2CpIO, this->m_dwData0);}/* * CNovaBase__ReadByte reads (8 bits = byte) and writes (1 bit = stop) * stop can be:	NOVA_CONT/NOVA_STOP/******************************************************************************/BYTE CNovaBase__ReadByte(IAnalogOverlay* pIAnalogOverlay, BOOL stop){	CNovaBase *this = (CNovaBase*) pIAnalogOverlay ;	BYTE byte=0;	int i;	ISetI2CpIO_SetDataDir(this->pISetI2CpIO, this->m_dwDataIN );	// SSDA input	for(i=0;i<8;i++)	{		byte = byte<<1;		byte |= ISetI2CpIO_RdData(this->pISetI2CpIO, this->m_dwData0);		CNovaBase__SSCK(pIAnalogOverlay, 0);		CNovaBase__SSCK(pIAnalogOverlay, 1);	}	ISetI2CpIO_SetDataDir(this->pISetI2CpIO, this->m_dwDataOUT );	// SSDA output	CNovaBase__SSCK(pIAnalogOverlay, 0);	CNovaBase__SSDA(pIAnalogOverlay, stop);	CNovaBase__SSCK(pIAnalogOverlay, 1);	QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT("NOVA_ReadByte=0x%02x"), byte));	return byte;}/* * CNovaBase__WriteByte writes (8 bits = byte) + (1 bit = bit) * byte can be: NOVA_ADDRESS=0x01	subaddress=0x0...0xD	data=0xXX * bit can be:	RD/WR	NOINC/INC	NOVA_CONT/NOVA_STOP/******************************************************************************/void CNovaBase__WriteByte(IAnalogOverlay* pIAnalogOverlay, BYTE byte, BOOL bit){	//	CNovaBase *this = (CNovaBase*) pIAnalogOverlay;	int i;	QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT("NOVA_Write9Bits = 0x%02x + %x"), byte, bit));	for(i=0;i<8;i++)	{		CNovaBase__SSCK(pIAnalogOverlay, 0);		CNovaBase__SSDA(pIAnalogOverlay, byte & 0x80);		CNovaBase__SSCK(pIAnalogOverlay, 1);		byte = byte<<1;	}	CNovaBase__SSCK(pIAnalogOverlay, 0);	CNovaBase__SSDA(pIAnalogOverlay, bit);	CNovaBase__SSCK(pIAnalogOverlay, 1);}/* * CNovaBase__Start writes [1 bit start]+[8 bits=0x01]+[1 bit wr_rd]+[8 bits address]+[1 bit increment] * wr_rd = 0 for read, 1 for write command * increment = 0 for no increment, 1 for increment/******************************************************************************/void CNovaBase__Start(IAnalogOverlay* pIAnalogOverlay, BYTE address, BOOL wr_rd, BOOL increment){	CNovaBase *this = (CNovaBase*) pIAnalogOverlay;	//start condition	ISetI2CpIO_SetDataDir(this->pISetI2CpIO, this->m_dwDataOUT );	// SSDA output	ISetI2CpIO_SetClockDir(this->pISetI2CpIO, this->m_dwClkOUT );	// SSCK output	CNovaBase__SSCK( pIAnalogOverlay, 1 );	CNovaBase__SSDA( pIAnalogOverlay, 1 );	CNovaBase__SSCK( pIAnalogOverlay, 0 );	CNovaBase__SSDA( pIAnalogOverlay, 1 );	CNovaBase__SSCK( pIAnalogOverlay, 1 );	CNovaBase__SSCK( pIAnalogOverlay, 0 );	CNovaBase__WriteByte( pIAnalogOverlay, NOVA_ADDRESS, wr_rd );	CNovaBase__WriteByte( pIAnalogOverlay, address, increment);	//subaddress}/****f* HwLib/IAnalogOverlay_Read * USAGE *	BYTE IAnalogOverlay_Read(IAnalogOverlay* pIAnalogOverlay, BYTE address) *	BYTE CNovaBase__Read(IAnalogOverlay* pIAnalogOverlay, BYTE address) * DESCRIPTION *	IAnalogOverlay_Read returns data read from register number "address". The read command *	is done through Sigma Serial interface protocol, using two EM8400' PIOs (data, clock), *	programmable by user with IID_ISETI2CPIO./******************************************************************************/BYTE CNovaBase__Read(IAnalogOverlay* pIAnalogOverlay, BYTE address){	CNovaBase *this = (CNovaBase*) pIAnalogOverlay;	BYTE Data;	CNovaBase__Start( pIAnalogOverlay, address, RD,NOINC );	Data = CNovaBase__ReadByte( pIAnalogOverlay, NOVA_STOP) ;	ISetI2CpIO_SetDataDir(this->pISetI2CpIO, this->m_dwDataIN );	// SSDA input	ISetI2CpIO_SetClockDir(this->pISetI2CpIO, this->m_dwClkIN );	// SSCK input	QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT("Rd 0x%02x = 0x%02x"), address, Data));	return Data;}/****f* HwLib/IAnalogOverlay_Write * USAGE *	void IAnalogOverlay_Write(IAnalogOverlay* pIAnalogOverlay, BYTE address, BYTE Data) *	void CNovaBase__Write(IAnalogOverlay* pIAnalogOverlay, BYTE address, BYTE Data) * DESCRIPTION *	IAnalogOverlay_Write writes "Data" to register number "address". The write command *	is done through Sigma Serial interface protocol, using two EM8400' PIOs (data, clock), *	programmable by user with IID_ISETI2CPIO./******************************************************************************/void CNovaBase__Write(IAnalogOverlay* pIAnalogOverlay, BYTE address, BYTE Data){	CNovaBase *this = (CNovaBase*) pIAnalogOverlay;	CNovaBase__Start(pIAnalogOverlay, address, WR,NOINC);	CNovaBase__WriteByte(pIAnalogOverlay, Data, NOVA_STOP);	ISetI2CpIO_SetDataDir(this->pISetI2CpIO, this->m_dwDataIN );	// SSDA input	ISetI2CpIO_SetClockDir(this->pISetI2CpIO, this->m_dwClkIN );	// SSCK input	QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT("Wr 0x%02x = 0x%02x"), address, Data));}/****f* HwLib/CNovaBase_nRead * USAGE *	NOT PRESENT in IAnalogOverlay interface *	void CNovaBase__nRead(IAnalogOverlay* pIAnalogOverlay, BYTE address, BYTE* pData, int Count, int autoinc) * DESCRIPTION *	IAnalogOverlay_nRead reads "Count" registers starting from "address". *	"autoinc" value (INC/NOINC) will decide if the address of the next register to read *	is incremented or not. *	The read is done through Sigma Serial interface protocol, using two EM8400' PIOs (data, clock), *	programmable by user with IID_ISETI2CPIO. The data is returned in "pData" buffer./******************************************************************************/void CNovaBase__nRead(IAnalogOverlay* pIAnalogOverlay, BYTE address, BYTE* pData, int Count, int autoinc){	CNovaBase *this = (CNovaBase*) pIAnalogOverlay;	int i;	BYTE *p = pData;	CNovaBase__Start(pIAnalogOverlay, address,RD,autoinc);	if(Count > 1)	{		for (i=0;i<Count-1;i++)		{			*p = CNovaBase__ReadByte( pIAnalogOverlay, NOVA_CONT );			p++;		}	}	*p = CNovaBase__ReadByte( pIAnalogOverlay, NOVA_STOP );	ISetI2CpIO_SetDataDir( this->pISetI2CpIO, this->m_dwDataIN );	// SSDA input	ISetI2CpIO_SetClockDir( this->pISetI2CpIO, this->m_dwClkIN );	// SSCK input	QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT("NOVA_Read at address 0x%02x"), address));}/****f* HwLib/CNovaBase_nWrite * USAGE *	NOT PRESENT in IAnalogOverlay interface *	void CNovaBase__nWrite(IAnalogOverlay* pIAnalogOverlay, BYTE address, BYTE* pData, int Count, int autoinc) * DESCRIPTION *	IAnalogOverlay_nWrite writes "Count" registers starting from "address". *	"autoinc" value (INC/NOINC) will decide if the address of the next register to write *	is incremented or not. *	The write is done through Sigma Serial interface protocol, using two EM8400' PIOs (data, clock), *	programmable by user with IID_ISETI2CPIO. The input data is taken from "pData" buffer./******************************************************************************/void CNovaBase__nWrite(IAnalogOverlay* pIAnalogOverlay, BYTE address,BYTE* pData,int Count, int autoinc){	CNovaBase *this = (CNovaBase*) pIAnalogOverlay;	int i;	BYTE *p = pData;	QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT("NOVA_Write at address 0x%02x"), address));	CNovaBase__Start( pIAnalogOverlay, address, WR, autoinc);	if(Count > 1)	{		for (i=0;i<Count-1;i++)		{			CNovaBase__WriteByte( pIAnalogOverlay, *p, NOVA_CONT );			p++;		}	}	CNovaBase__WriteByte( pIAnalogOverlay, *p, NOVA_STOP );	ISetI2CpIO_SetDataDir( this->pISetI2CpIO, this->m_dwDataIN );	// SSDA input	ISetI2CpIO_SetClockDir( this->pISetI2CpIO, this->m_dwClkIN );	// SSCK input}#endif // NOVA_OBJECT | NOVALITE_OBJECT

⌨️ 快捷键说明

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