📄 shuttle.c
字号:
idtImpactDeviceType = ParStlReadReg ( Extension, CONFIG_DATA_REGISTER ) >> 4 ;
switch ( idtImpactDeviceType )
{
case IMPACT_DEVICE_TYPE_ATA_ATAPI:
// set the 16 bit mode of the adapter
ParStlSet16BitOperation(Extension) ;
if (TRUE == ParStlCheckIfAtaAtapiDevice(Extension,atapiParams))
{
// necessary but not sufficient condition has passed
// proceed for sufficency checks
if (TRUE == ParStlCheckIfAtapiDevice(Extension,atapiParams))
{
// atapi identified
// Check for Impact LS-120 device
if ( TRUE == ParStlCheckIfImpactLS120(Extension, atapiParams))
{
dtDeviceType |= DEVICE_TYPE_LS120_BIT ;
break ;
}
dtDeviceType |= DEVICE_TYPE_ATAPI_BIT;
break ;
}
if (TRUE == ParStlCheckIfAtaDevice(Extension, atapiParams))
{
// ata identified
dtDeviceType |= DEVICE_TYPE_ATA_BIT;
break;
}
}
break ;
case IMPACT_DEVICE_TYPE_CF:
dtDeviceType |= DEVICE_TYPE_FLASH_BIT;
break ;
case IMPACT_DEVICE_TYPE_PCMCIA_CF:
dtDeviceType |= DEVICE_TYPE_PCMCIA_CF_BIT ;
break;
case IMPACT_DEVICE_TYPE_SSFDC:
dtDeviceType |= DEVICE_TYPE_SSFDC_BIT ;
break;
case IMPACT_DEVICE_TYPE_MMC:
dtDeviceType |= DEVICE_TYPE_MMC_BIT ;
break;
case IMPACT_DEVICE_TYPE_HIFD:
dtDeviceType |= DEVICE_TYPE_HIFD_BIT ;
break;
case IMPACT_DEVICE_TYPE_SOUND:
dtDeviceType |= DEVICE_TYPE_SOUND_BIT ;
break;
case IMPACT_DEVICE_TYPE_FLP_TAPE_DSK:
dtDeviceType |= DEVICE_TYPE_FLP_TAPE_DSK_BIT ;
break;
case IMPACT_DEVICE_TYPE_ATA_ATAPI_8BIT:
dtDeviceType |= DEVICE_TYPE_ATA_ATAPI_8BIT_BIT ;
break;
default:
break;
}
return dtDeviceType & nPreferredDeviceType ;
}
STL_DEVICE_TYPE
ParStlGetImpactSDeviceType (
IN PPDO_EXTENSION Extension,
IN OUT PATAPIPARAMS atapiParams,
IN int nPreferredDeviceType
)
{
IMPACT_DEVICE_TYPE idtImpactDeviceType ;
IMPACT_DEVICE_TYPE idtImpactSDeviceType ;
STL_DEVICE_TYPE dtDeviceType = DEVICE_TYPE_NONE ;
ParStlWriteReg ( Extension, CONFIG_INDEX_REGISTER, IMPACT_PERSONALITY_REG ) ;
idtImpactDeviceType = ParStlReadReg ( Extension, CONFIG_DATA_REGISTER ) >> 4 ;
switch ( idtImpactDeviceType )
{
case IMPACT_DEVICE_TYPE_ATA_ATAPI:
// set the 16 bit mode of the adapter
ParStlSet16BitOperation(Extension) ;
if (TRUE == ParStlCheckIfAtaAtapiDevice(Extension,atapiParams))
{
// necessary but not sufficient condition has passed
// proceed for sufficency checks
if (TRUE == ParStlCheckIfAtapiDevice(Extension,atapiParams))
{
// atapi identified
dtDeviceType |= DEVICE_TYPE_ATAPI_BIT;
break ;
}
if (TRUE == ParStlCheckIfAtaDevice(Extension,atapiParams))
{
// ata identified
dtDeviceType |= DEVICE_TYPE_ATA_BIT;
break;
}
}
break ;
case IMPACT_DEVICE_TYPE_CF:
dtDeviceType |= DEVICE_TYPE_FLASH_BIT;
break ;
case IMPACT_DEVICE_TYPE_PCMCIA_CF:
dtDeviceType |= DEVICE_TYPE_PCMCIA_CF_BIT ;
break;
case IMPACT_DEVICE_TYPE_SSFDC:
dtDeviceType |= DEVICE_TYPE_SSFDC_BIT ;
break;
case IMPACT_DEVICE_TYPE_MMC:
dtDeviceType |= DEVICE_TYPE_MMC_BIT ;
break;
case IMPACT_DEVICE_TYPE_HIFD:
dtDeviceType |= DEVICE_TYPE_HIFD_BIT ;
break;
case IMPACT_DEVICE_TYPE_SOUND:
dtDeviceType |= DEVICE_TYPE_SOUND_BIT ;
break;
case IMPACT_DEVICE_TYPE_FLP_TAPE_DSK:
dtDeviceType |= DEVICE_TYPE_FLP_TAPE_DSK_BIT ;
break;
case IMPACT_DEVICE_TYPE_ATA_ATAPI_8BIT:
dtDeviceType |= DEVICE_TYPE_ATA_ATAPI_8BIT_BIT ;
break;
case IMPACTS_EXT_PERSONALITY_PRESENT:
ParStlWriteReg ( Extension, CONFIG_INDEX_REGISTER, IMPACTS_EXT_PERSONALITY_XREG ) ;
idtImpactSDeviceType = ParStlReadReg ( Extension, CONFIG_DATA_REGISTER ) ;
dtDeviceType = DEVICE_TYPE_EXT_HWDETECT ;
dtDeviceType |= idtImpactSDeviceType ;
break ;
default:
break;
}
return dtDeviceType & nPreferredDeviceType ;
}
BOOLEAN
ParStlCheckIfLS120 (
IN PPDO_EXTENSION Extension
)
{
BOOLEAN bReturnValue = FALSE;
do
{
if ( FALSE == ParStlSelectAdapterSocket(Extension, SOCKET_1) )
{
// as the socket 1 selection failed,
// we break out here.
break ;
}
// check for engine version.
if ( LS120_ENGINE_VERSION == ParStlReadIoPort( Extension, LS120_ENGINE_VERSION_REGISTER ) )
{
// if the ls120 engine version is correct, we have
// found LS120.
bReturnValue = TRUE ;
}
// Reset the socket to zero.
ParStlSelectAdapterSocket ( Extension, SOCKET_0 ) ;
}
while ( FALSE ) ;
return bReturnValue ;
}
BOOLEAN
ParStlCheckIfImpactLS120 (
IN PPDO_EXTENSION Extension,
IN OUT PATAPIPARAMS atapiParams
)
{
BOOLEAN bReturnValue = FALSE ;
BOOLEAN bLs120NameFound= TRUE ;
char chLs120Name[] = "HU DlFpoyp";
char *pszAtapiName = atapiParams->szAtapiNameString ;
int i , nMemoryOnBoard ;
do
{
for ( i = 0 ;i < sizeof(chLs120Name)-1 ; i++ )
{
if ( pszAtapiName[i] != chLs120Name[i] )
{
bLs120NameFound = FALSE ;
break ;
}
}
if ( TRUE != bLs120NameFound )
{
// as LS-120 name string is not found, we conclude that it is
// not LS-120
break ;
}
nMemoryOnBoard = ParStlGetMemorySize(Extension) ;
if ( ( !IsShtlError ( nMemoryOnBoard ) ) && \
( nMemoryOnBoard ) )
{
// there is memory on-board.
// hence, we return ls120 here
bReturnValue = TRUE ;
break ;
}
}
while ( FALSE ) ;
return bReturnValue ;
}
BOOLEAN
ParStlCheckIfMMC (
IN PPDO_EXTENSION Extension,
IN OUT PATAPIPARAMS atapiParams
)
{
BOOLEAN bReturnValue = FALSE;
do
{
if ( FALSE == IsEpatPlusPresent() )
{
// as mmc device can exist only on EPAT Plus adapter only
// we break out of here
break;
}
if ( TRUE == ParStlCheckIfAtaAtapiDevice (Extension,atapiParams) )
{
// as an ATA/ATAPI device is probably present,
// we break out of here
break;
}
bReturnValue = ParStlIsMMCEnginePresent(Extension) ;
}
while ( FALSE ) ;
return bReturnValue ;
}
BOOLEAN
ParStlIsMMCEnginePresent(
IN PPDO_EXTENSION Extension
)
{
BOOLEAN bReturnValue = FALSE;
do
{
// check if the ATAPI signature is present in the cyl hi/lo
// registers. If present, it is definitely an ATAPI device
if ( ( ParStlReadIoPort(Extension, CYLLOW_REG) == ATAPI_SIGN_LOW ) &&\
( ParStlReadIoPort(Extension, CYLHIGH_REG) == ATAPI_SIGN_HI ) )
{
// as ATAPI signature is present, it cant be MMC
break ;
}
// write a zero pattern ( which will be a NOP for ATA/ATAPI devices )
// in the block size / possible ATA/ATAPI command register
ParStlWriteReg(Extension, MMC_ENGINE_INDEX, MMC_BLOCK_SIZE_REG);
ParStlWriteReg(Extension, MMC_ENGINE_DATA, MMC_TEST_PATTERN_1);
if ( MMC_TEST_PATTERN_1 != ParStlReadReg(Extension, MMC_ENGINE_DATA) )
{
// as the written value is not available, it means device present
// has responded to the written value, in a way different from
// how an MMC would have.
break ;
}
// write a test pattern in the freq register
ParStlWriteReg(Extension, MMC_ENGINE_INDEX, MMC_FREQ_SELECT_REG);
ParStlWriteReg(Extension, MMC_ENGINE_DATA, MMC_TEST_PATTERN_2);
// write another in the block size register
ParStlWriteReg(Extension, MMC_ENGINE_INDEX, MMC_BLOCK_SIZE_REG);
ParStlWriteReg(Extension, MMC_ENGINE_DATA, MMC_TEST_PATTERN_3);
ParStlWriteReg(Extension, MMC_ENGINE_INDEX, MMC_FREQ_SELECT_REG);
if ( MMC_TEST_PATTERN_2 != ParStlReadReg(Extension, MMC_ENGINE_DATA) )
{
// as we were not able to read back the written value
// we quit here
break;
}
ParStlWriteReg(Extension, MMC_ENGINE_INDEX, MMC_BLOCK_SIZE_REG);
if ( MMC_TEST_PATTERN_3 != ParStlReadReg(Extension, MMC_ENGINE_DATA) )
{
// as we were not able to read back the written value
// we quit here
break;
}
// as all tests have passed, engine presence is confirmed
// here
bReturnValue = TRUE ;
}
while ( FALSE ) ;
return bReturnValue ;
}
BOOLEAN
ParStlCheckIfScsiDevice (
IN PPDO_EXTENSION Extension
)
{
BOOLEAN bReturnValue = FALSE;
do
{
if ( FALSE == IsEpstPresent() )
{
// as SCSI devices live only on EPST we break here
break;
}
bReturnValue = TRUE ;
}
while ( FALSE ) ;
return bReturnValue ;
}
BOOLEAN
ParStlCheckIfSSFDC (
IN PPDO_EXTENSION Extension
)
{
BOOLEAN bReturnValue = FALSE;
do
{
if ( FALSE == IsEp1284Present() )
{
// SSFDC lives on EP1284 alone, other than impact
// which is already taken care
break;
}
//check to see if the loop back of the EPCS and EPDO pins
//of the INDEX 00 register read the same. If so, it is
//SSFDC board characteristic
ParStlWriteReg ( Extension, CONFIG_INDEX_REGISTER , 0x00 ) ;
ParStlWriteReg ( Extension, CONFIG_DATA_REGISTER , 0x10 ) ;
ParStlWriteReg ( Extension, CONFIG_DATA_REGISTER , 0x12 ) ;
if ( 0x1A == ParStlReadReg ( Extension, CONFIG_DATA_REGISTER ) )
{
ParStlWriteReg ( Extension, CONFIG_DATA_REGISTER , 0x10 ) ;
if ( ! ( ParStlReadReg ( Extension, CONFIG_DATA_REGISTER ) & 0x08 ) )
{
//as they are equal, SSFDC present
bReturnValue = TRUE ;
break ;
}
}
}
while ( FALSE ) ;
return bReturnValue ;
}
VOID
ParStlAssertIdleState (
IN PPDO_EXTENSION Extension
)
{
PUCHAR CurrentPort, CurrentControl ;
ULONG Delay = 5 ;
CurrentPort = Extension->Controller;
CurrentControl = CurrentPort + 2;
// place op-code for idle state in port base
P5WritePortUchar ( CurrentPort, (UCHAR) 0x00 ) ;
KeStallExecutionProcessor( Delay );
// bring down DCR_INIT and DCR_STROBE
P5WritePortUchar ( CurrentControl, (UCHAR) STB_INIT_LOW ) ;
KeStallExecutionProcessor( Delay );
// lift DCR_INIT and DCR_STROBE to high
P5WritePortUchar ( CurrentControl, (UCHAR) STB_INIT_AFXT_HI ) ;
KeStallExecutionProcessor( Delay );
}
BOOLEAN
ParStlCheckAvisionScannerPresence(
IN PPDO_EXTENSION Extension
)
{
BOOLEAN bReturnValue = FALSE ;
UCHAR data;
do {
data
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -