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

📄 tmhal.c

📁 wince host 和 target PCI驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		*((PDWORD)(this->MMIO.pSpace + TIMER1_TCTL)) &= 0xFFFFFFFE;
		*((PDWORD)(this->MMIO.pSpace + TIMER2_TCTL)) &= 0xFFFFFFFE;
		*((PDWORD)(this->MMIO.pSpace + TIMER3_TCTL)) &= 0xFFFFFFFE;	
		*((PDWORD)(this->MMIO.pSpace + SYSTIMER_TCTL)) &= 0xFFFFFFFE;

		// instruction breakpoint off 		
		*((PDWORD)(this->MMIO.pSpace + BICTL)) = 0;	

		// data breakpoint off
		*((PDWORD)(this->MMIO.pSpace + BDCTL)) = 0;

		*((PDWORD)(this->MMIO.pSpace + JTAG_DATA_IN))	= 0x0;
		*((PDWORD)(this->MMIO.pSpace + JTAG_DATA_OUT))	= 0x0;
		*((PDWORD)(this->MMIO.pSpace + JTAG_CTL))		= 0x04;

	}
}

VOID	halDSPReset ( PVOID pvObject )
{
	PTMHAL_OBJECT this = (PTMHAL_OBJECT)pvObject;
	DWORD			ResetINT, Idx;

	if ( ((PINIT_OBJECT)(pDriverObject->pInitObj))->dwDisableHal )
		return;
	
	ResetINT = ((PINIT_OBJECT)(pDriverObject->pInitObj))->dwHardReset;

	*((PDWORD)(this->MMIO.pSpace + INT_CTL)) |=
		( ( 1 << ResetINT) |
		( 0x10 << ResetINT ) );

	// once we whack the reset the chip is dead no mmio accessses will work.
	// wait for 350mS for TRI_RESET to be pulled highstabilize + 250uS for IIC to
	// dump the 10 bytes of EEPROM data.
	winStallProcessorExecution ( 700000 );

}

STATUS	halDestroy ( PVOID pObject )
{
	PTMHAL_OBJECT this = (PTMHAL_OBJECT)pObject;

	shmemFree ( GetShMemObject ( this->pContainer), this->pSharedData );
	this->Size = 0;
	if( FlagGet ( this->Flags, TMHAL_FLAG_DYNAMICOBJ ) )
	{
		vxdFree ( this );
	}
	return TMOK;
}

VOID	halIRQConnect( PVOID pObject, DWORD dwIRQ, BOOL fLevelTrigger,
	BYTE bPriority, DWORD dwInterruptHandler )
{
	PTMHAL_OBJECT this = (PTMHAL_OBJECT)pObject;
	DWORD	dwISetting, dwIMask;
	BYTE	bPriorityTrigger;

	if ( ((PINIT_OBJECT)(pDriverObject->pInitObj))->dwDisableHal )
		return;


	dwISetting = this->MMIO.pVIC->dwISetting[ dwIRQ / 8 ];
	bPriorityTrigger =
		(( 0x07 & bPriority ) | ((fLevelTrigger == TRUE) ? 0x80 : 0x00) );
	dwISetting |= ( bPriorityTrigger  << ( ( dwIRQ % 8 ) * 4 ) ); 
	this->MMIO.pVIC->dwISetting[ dwIRQ / 8 ] = dwISetting;

	dwIMask = this->MMIO.pVIC->dwIMask;
	dwIMask |= ( 1 << dwIRQ );
	this->MMIO.pVIC->dwIMask = dwIMask;

	this->MMIO.pVIC->dwIntVect[dwIRQ] = dwInterruptHandler;

}

VOID	halIRQDisconnect( PVOID pObject, DWORD dwIRQ )
{
	PTMHAL_OBJECT this = (PTMHAL_OBJECT)pObject;

}

VOID	halIRQDisable( PVOID pObject, DWORD dwIRQ )
{
	PTMHAL_OBJECT this = (PTMHAL_OBJECT)pObject;
	DWORD	dwIMask;

	if ( ((PINIT_OBJECT)(pDriverObject->pInitObj))->dwDisableHal )
		return;

	dwIMask = this->MMIO.pVIC->dwIMask;
	dwIMask &= (~( 1 << dwIRQ ));
	this->MMIO.pVIC->dwIMask = dwIMask;
}

VOID	halIRQEnable( PVOID	pObject, DWORD dwIRQ )
{
	PTMHAL_OBJECT this = (PTMHAL_OBJECT)pObject;
	DWORD	dwIMask;

	if ( ((PINIT_OBJECT)(pDriverObject->pInitObj))->dwDisableHal )
		return;

	dwIMask = this->MMIO.pVIC->dwIMask;
	dwIMask |= ( 1 << dwIRQ );
	this->MMIO.pVIC->dwIMask = dwIMask;
}

VOID	halIRQDSPGen( PVOID pObject )
{
	PTMHAL_OBJECT this = (PTMHAL_OBJECT)pObject;
	WORD	wPrinterPort = this->wPrinterPort;

	if ( ((PINIT_OBJECT)(pDriverObject->pInitObj))->dwDisableHal )
		return;

	if  ( ( TMSTD_GETTMTYPE(this->CPUVersion) == TMSTD_TYPE_TM1000 ) &&
		( TMSTD_GETTMREV(this->CPUVersion) == 0 ) )
	{
			/* hack for generating interrupts from host to DSP 
				using printer port LPT1 */

			__asm  {
			push	eax
			push	edx
			mov		dx, wPrinterPort
			mov		al, 01h
			out 	dx, al
			mov		al, 00h
			out 	dx, al
			pop		edx
			pop		eax
			}
			
	}
	else
	{
		this->MMIO.pVIC->dwIPending = ( 1<< TMHD_HAL_DSPIRQNUMBER_TM1 ); 
	}

}

BOOL	halBIUIsIRQOurs ( PVOID pObject )
{
	PTMHAL_OBJECT this = (PTMHAL_OBJECT)pObject;
	DWORD		dwInterruptControl;
	
	if ( ((PINIT_OBJECT)(pDriverObject->pInitObj))->dwDisableHal )
		return FALSE;

	if  ( ( TMSTD_GETTMTYPE(this->CPUVersion) == TMSTD_TYPE_TM1000 ) &&
		( TMSTD_GETTMREV(this->CPUVersion) == 0 ) )
	{
		/* we couldn't be sharing interrupts on a CTC - assume interrupt is always ours */
		this->pSharedData->Ring0ISRActive = FALSE;
		return TRUE;
	}
	else
	{
		/*	read the interrupt registers and make sure that TriMedia 
			generated this interrupt 
	    */
		/*
			reset	MMIO->dwInterruptControl:INT(3..0)
			reset	MMIO->dwInterruptControl:IE(7..4)
		*/
		dwInterruptControl = this->MMIO.pBIU->dwInterruptControl;

		// check if the relevant bits a re set , then the interrupt is ours.

		if ( ( dwInterruptControl &
			( ( 1 << ( TMHD_HAL_PCIIRQNUMBER - 0x0a ) )  |
			( 0x10 << ( TMHD_HAL_PCIIRQNUMBER - 0x0a )  ) ) ) == 
			( ( 1 << ( TMHD_HAL_PCIIRQNUMBER - 0x0a ) )  |
			( 0x10 << ( TMHD_HAL_PCIIRQNUMBER - 0x0a )  ) ) )
		{
			return TRUE;
		}
		else
		{
			return FALSE;
		}
	}
}

VOID	halBIUHostIRQAck( PVOID pObject )
{
	PTMHAL_OBJECT this = (PTMHAL_OBJECT)pObject;
	DWORD		dwInterruptControl;
	
	if ( ((PINIT_OBJECT)(pDriverObject->pInitObj))->dwDisableHal )
		return;

	if  ( ( TMSTD_GETTMTYPE(this->CPUVersion) == TMSTD_TYPE_TM1000 ) &&
		( TMSTD_GETTMREV(this->CPUVersion) == 0 ) )
	{
		this->pSharedData->Ring0ISRActive = FALSE;
	}
	else
	{
		if ( this->TargetMinorVersion <= 7 )
		{
			/* FOR TM1 */
			/*
				reset	MMIO->dwInterruptControl:INT(3..0)
				reset	MMIO->dwInterruptControl:IE(7..4)
			*/
			dwInterruptControl = this->MMIO.pBIU->dwInterruptControl;

			dwInterruptControl &=
				( ~( 1 << ( TMHD_HAL_PCIIRQNUMBER - 0x0a ) )  &
				~( 0x10 << ( TMHD_HAL_PCIIRQNUMBER - 0x0a ) ) );

			this->MMIO.pBIU->dwInterruptControl = dwInterruptControl;
		}
		else /* new changes for INT_CTL */
		{
			while (1)
			{ 
				// is the host in the process of accessing the INT_CTL 
				if  ( this->pSharedData->T2HInterruptReq == FALSE )
				{
					// we want to access the INT_CTL 
					this->pSharedData->H2TInterruptReq = TRUE;

					//check if we have done it at the right time 
					if (  this->pSharedData->T2HInterruptReq == TRUE )
					{
						// too late - back out 
						this->pSharedData->H2TInterruptReq = FALSE;
					}
					else
					{
						dwInterruptControl = this->MMIO.pBIU->dwInterruptControl;
						dwInterruptControl &=
							( ~( 1 << ( TMHD_HAL_PCIIRQNUMBER - 0x0a ) )  &
							~( 0x10 << ( TMHD_HAL_PCIIRQNUMBER - 0x0a ) ) );

						// set the PCI interrupt 
						this->MMIO.pBIU->dwInterruptControl = dwInterruptControl;

						// we are done so set the semaphore to its original value 
						this->pSharedData->H2TInterruptReq = FALSE;
						break;
					}
				}
			}
		}
	}
}

VOID	halBIUHostIRQGen( PVOID pObject )
{
	PTMHAL_OBJECT this = (PTMHAL_OBJECT)pObject;
	DWORD		dwInterruptControl;

	if ( ((PINIT_OBJECT)(pDriverObject->pInitObj))->dwDisableHal )
		return;
	/*
		set	MMIO->dwInterruptControl:INT(3..0)
		set	MMIO->dwInterruptControl:IE(7..4)
	*/

	dwInterruptControl = this->MMIO.pBIU->dwInterruptControl;

	dwInterruptControl |=
		( ( 1 << ( TMHD_HAL_PCIIRQNUMBER - 0x0a ) ) |
		( 0x10 << ( TMHD_HAL_PCIIRQNUMBER - 0x0a ) ) );



	this->MMIO.pBIU->dwInterruptControl = dwInterruptControl;
}

VOID	halIRQDSPAck( PVOID pObject )
{
	PTMHAL_OBJECT this = (PTMHAL_OBJECT)pObject;

	if ( ((PINIT_OBJECT)(pDriverObject->pInitObj))->dwDisableHal )
		return;

	this->MMIO.pVIC->dwIClear = ( 1<< TMHD_HAL_DSPIRQNUMBER_TM1 );

}

VOID	halUnreset ( PVOID pvObject )
{
	PTMHAL_OBJECT this = (PTMHAL_OBJECT)pvObject;

	if ( ((PINIT_OBJECT)(pDriverObject->pInitObj))->dwDisableHal )
		return;

	this->MMIO.pBIU->dwBIUControl |= TMHAL_BIU_CONTROL_CR;
}

BOOL	halIsTMRunning ( PVOID pvObject )
{
	PTMHAL_OBJECT this = (PTMHAL_OBJECT)pvObject;

	if ( ((PINIT_OBJECT)(pDriverObject->pInitObj))->dwDisableHal )
		return FALSE;

	if  ( ( TMSTD_GETTMTYPE(this->CPUVersion) == TMSTD_TYPE_TM1000 ) &&
		( TMSTD_GETTMREV(this->CPUVersion) == 0 ) )
	{
		return ( ! (  ( this->MMIO.pBIU->dwBIUControl & TMHAL_BIU_CONTROL_CR ) ==  0 ) );
	}

	return (  ( this->MMIO.pBIU->dwBIUControl & TMHAL_BIU_CONTROL_SR ) ==  0 );
	//return ! ( (  ( this->MMIO.pBIU->dwBIUControl & TMHAL_BIU_CONTROL_CR ) ==  TMHAL_BIU_CONTROL_CR ) && 
	//(  ( this->MMIO.pBIU->dwBIUControl & TMHAL_BIU_CONTROL_SR ) ==  0 ) );
}

BOOL	halGetTargetVersion ( 
	PVOID pvObject, 
	PDWORD MajorVersion, 
	PDWORD MinorVersion )
{
	PTMHAL_OBJECT this = (PTMHAL_OBJECT)pvObject;

	*MajorVersion = this->TargetMajorVersion;
	*MinorVersion = this->TargetMinorVersion;

	return TRUE;
}

BOOL	halSetTargetVersion ( 
	PVOID pvObject, 
	DWORD MajorVersion, 
	DWORD MinorVersion )
{
	PTMHAL_OBJECT this = (PTMHAL_OBJECT)pvObject;

	this->TargetMajorVersion = MajorVersion;
	this->TargetMinorVersion = MinorVersion;

	return TRUE;
}

VOID	halDebugDump ( PVOID pDevice )
{
	PTMHAL_OBJECT this = GetHALObject ( pDevice );
	CHAR	szTemp[81];

	_Sprintf ( szTemp, 
		"halr:H2TR[%08x]:T2HR[%08x]\n",
		this->pSharedData->H2TInterruptReq, this->pSharedData->T2HInterruptReq );
   	DP(0,szTemp);

}

⌨️ 快捷键说明

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