📄 tmhal.c
字号:
*((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 + -