📄 shuttle.c
字号:
// There is a need to check the device identifier returned in the
// ATAPI Identify cmd. to determine the presence of Ls-120.
ParStlReceiveData ( Extension, chAtapiIdentifyBuffer , SKIP_MEMORY_ADDRESS , ATAPI_IDENTIFY_LENGTH ) ;
for ( i = 0 ; i < ATAPI_NAME_LENGTH ; i++ )
{
atapiParams->szAtapiNameString[i] = chAtapiIdentifyBuffer[ ATAPI_NAME_OFFSET + i ] ;
}
// set this flag so that, ATA initialize will skip this
// target
atapiParams->dsDeviceState[nCurrentDrive] = DEVICE_STATE_ATAPI ;
}
}
while ( ++nCurrentDrive < ATAPI_MAX_DRIVES );
// reset back to master state, as check drive present
// will be called successively
ParStlWriteIoPort(Extension, ATA_DRVHD_REG, ATAPI_MASTER);
return ( bReturnValue ) ;
}
BOOLEAN
ParStlAtaInitialize (
IN PPDO_EXTENSION Extension,
IN OUT PATAPIPARAMS atapiParams
)
{
BOOLEAN bReturnValue = FALSE ;
UCHAR byTempValue ;
int nCurrentDrive = 0 ;
do
{
if ( DEVICE_STATE_VALID != atapiParams->dsDeviceState[nCurrentDrive] )
{
// atapi module has marked its presence or the device is absent
continue ;
}
// select the possibly present device
if ( nCurrentDrive )
{
ParStlWriteIoPort(Extension, ATA_DRVHD_REG, ATAPI_SLAVE ) ;
}
else
{
ParStlWriteIoPort(Extension, ATA_DRVHD_REG, ATAPI_MASTER ) ;
}
if ( FALSE == ParStlWaitForBusyToClear(Extension, ATA_TASK_STAT_REG) )
{
// as busy has permanently set after master/slave, we fail the
// detection process
continue ;
}
// issue the ata NOP command
ParStlWriteIoPort(Extension, ATA_TASK_CMD_REG, ATA_NOP_COMMAND) ;
if ( FALSE == ParStlWaitForBusyToClear(Extension, ATA_TASK_STAT_REG) )
{
// as busy has permanently set, we fail the detection process
continue ;
}
byTempValue = (UCHAR) ParStlReadIoPort ( Extension, ATA_TASK_STAT_REG ) ;
if ( ( byTempValue != BUS_LINES_IN_HIGH_IMPEDANCE ) &&\
( byTempValue & ATA_ST_ERROR ) )
{
// as the bus is not reading 0xFF and the status register
// indicates an error, this is likely to be an ATA device
if ( ATA_ERROR_ABORTED_COMMAND == ( (UCHAR) ParStlReadIoPort ( Extension, ATA_ERROR_REG ) & 0x0F ) )
{
// as the error register, contains the ata aborted error
// in response to our ATA NOP command, we conclude that
// it is ATA! as it is already known that it is not ATAPI
bReturnValue = TRUE ;
break;
}
}
}
while ( ++nCurrentDrive < ATAPI_MAX_DRIVES );
// reset back to master state, as check drive present
// will be called successively
ParStlWriteIoPort(Extension, ATA_DRVHD_REG, ATAPI_MASTER);
return ( bReturnValue ) ;
}
BOOLEAN
ParStlWaitForBusyToClear (
IN PPDO_EXTENSION Extension,
IN int nRegisterToWaitOn
)
{
// The default timeout increased to 10secs as Fujitsu MO is found to set
// BUSY for >5secs for 0xA1 command.
int nMaxRetrials = MAX_RETRIES_FOR_10_SECS ;
BOOLEAN bRetVal = FALSE ;
while ( nMaxRetrials-- )
{
// the following service will be implemented by the caller
// the driver can use the STLMPORT service.
ParStlWaitForMicroSeconds ( DELAY_1MILLISECONDS ) ;
if ( ! ( ParStlReadIoPort ( Extension, nRegisterToWaitOn ) & ATA_ST_BUSY ) )
{
// as busy has cleared, we return clear here
bRetVal = TRUE ;
break ;
}
}
return bRetVal ;
}
BOOLEAN
ParStlWaitForDrq (
IN PPDO_EXTENSION Extension
)
{
int nMaxRetrials = MAX_RETRIES_FOR_5_SECS ;
BOOLEAN bRetVal = FALSE ;
while ( nMaxRetrials-- )
{
if ( ParStlReadIoPort ( Extension, ATA_TASK_STAT_REG ) & ATA_ST_DRQ )
{
// as busy has cleared, we return clear here
bRetVal = TRUE ;
break ;
}
// the following service will be implemented by the caller
// the driver can use the STLMPORT service.
ParStlWaitForMicroSeconds ( DELAY_1MILLISECONDS ) ;
}
return bRetVal ;
}
BOOLEAN
ParStlWaitForIrq (
IN PPDO_EXTENSION Extension
)
{
int nMaxRetrials = MAX_RETRIES_FOR_10_SECS ;
BOOLEAN bRetVal = FALSE ;
while ( nMaxRetrials-- )
{
if ( ParStlReadReg ( Extension, EP1284_TRANSFER_CONTROL_REG ) & XFER_IRQ_BIT )
{
// as Irq has asserted, we return true here
bRetVal = TRUE ;
break ;
}
ParStlWaitForMicroSeconds ( DELAY_1MILLISECONDS ) ;
}
return bRetVal ;
}
VOID
ParStlSet16BitOperation (
IN PPDO_EXTENSION Extension
)
{
int nModeReg ;
nModeReg = ParStlReadReg ( Extension, EP1284_MODE_REGISTER ) ;
if ( 0 == ( nModeReg & EP1284_ENABLE_16BIT ) )
{
// as the bit is not already set, this needs to be set now
ParStlWriteReg ( Extension, EP1284_MODE_REGISTER, nModeReg | EP1284_ENABLE_16BIT ) ;
}
}
BOOLEAN
ParStlCheckIfEppDevice (
IN PPDO_EXTENSION Extension
)
{
BOOLEAN bReturnValue = FALSE;
do
{
if ( FALSE == IsEp1284Present() )
{
// as EPPDEVs live only on EP1284 we break here
break;
}
bReturnValue = ParStlCheckPersonalityForEppDevice(Extension) ;
}
while ( FALSE ) ;
return bReturnValue ;
}
BOOLEAN
ParStlCheckPersonalityForEppDevice (
IN PPDO_EXTENSION Extension
)
{
BOOLEAN bReturnValue = FALSE ;
ParStlWriteReg ( Extension, CONFIG_INDEX_REGISTER, EP1284_PERSONALITY_REG ) ;
if ( EPPDEV_SIGN == ( ParStlReadReg ( Extension, CONFIG_DATA_REGISTER ) & PERSONALITY_MASK ) )
{
// as the EPPDEV sign is found in the personality
// we break with success here
bReturnValue = TRUE ;
}
return bReturnValue ;
}
BOOLEAN
ParStlCheckIfFlash (
IN PPDO_EXTENSION Extension
)
{
BOOLEAN bReturnValue = FALSE ;
do
{
if ( !IsEp1284Present() && !IsImpactPresent() && !IsEpatPlusPresent() )
{
// Check the sign-on version checks for the existence of Shuttle
// adapter. If nothing is found, we break here.
break ;
}
// Perform a ATA-16bit check just in case, it turns out to be something else
bReturnValue = ParStlCheckFlashPersonality(Extension) ;
}
while ( FALSE ) ;
return bReturnValue ;
}
BOOLEAN
ParStlCheckFlashPersonality (
IN PPDO_EXTENSION Extension
)
{
BOOLEAN bReturnValue = FALSE ;
if ( IsEp1284Present() )
{
// as the personality configuration check only works for
// Ep1284, confim its presence before the actual check.
ParStlWriteReg ( Extension, CONFIG_INDEX_REGISTER, EP1284_PERSONALITY_REG ) ;
if ( FLASH_SIGN == ( ParStlReadReg ( Extension, CONFIG_DATA_REGISTER ) & FLASH_PERSONALITY_MASK ) )
{
// as the flash sign ATA-16bit device is found in the personality
// we break with success here
bReturnValue = TRUE ;
}
}
else
{
// always return true, if a shuttle adapter other than ep1284 is
// identified and assume it might be flash!
bReturnValue = TRUE ;
}
return bReturnValue ;
}
BOOLEAN
ParStlCheckIfDazzle (
IN PPDO_EXTENSION Extension
)
{
BOOLEAN bReturnValue = FALSE ;
UCHAR ucSignature ;
do
{
if ( !IsEp1284Present() )
{
// Check for EP1284 presence, as Dazzle is ONLY on EP1284
// adapters. If the adapter is not EP1284, we break.
break ;
}
// Check whether any card insertion is detected, to eliminate
// possible flash adapters with the card in
if ( TRUE == ParStlCheckCardInsertionStatus( Extension ) ) {
break ;
}
// code to read the pulled up pattern present on dazzle
// adapters.
ParStlWriteReg( Extension, DAZ_SELECT_BLK, DAZ_BLK0 ) ;
ucSignature = (UCHAR) ParStlReadReg( Extension, DAZ_REG1 ) ;
if ( ( ucSignature == DAZ_CONFIGURED ) ||\
( ucSignature == DAZ_NOT_CONFIGURED ) ) {
// the pulled up pattern generally found ONLY
// on the DAZZLE adapter is found. So, we
// conclude that it is a Dazzle adapter
bReturnValue = TRUE ;
}
}
while ( FALSE ) ;
return bReturnValue ;
}
BOOLEAN
ParStlCheckIfHiFD (
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 the ready status of the floppy controller,
// after clearing the reset bit of the floppy controller.
if ( FALSE == ParStlHIFDCheckIfControllerReady(Extension) )
{
// since the controller didnot wake up after the
// reset pin was asserted, we break here.
break ;
}
if ( FALSE == ParStlHIFDCheckSMCController(Extension) )
{
// as the SMC ID retrieval failed,
// we break out here.
break ;
}
bReturnValue = TRUE ;
}
while ( FALSE ) ;
// Reset the socket to zero.
ParStlSelectAdapterSocket(Extension, SOCKET_0);
return bReturnValue ;
}
BOOLEAN
ParStlHIFDCheckIfControllerReady (
IN PPDO_EXTENSION Extension
)
{
BOOLEAN bReturnValue = FALSE ;
UCHAR bySCRControlReg ;
do
{
ParStlWriteReg ( Extension, CONFIG_INDEX_REGISTER , SOCKET_CONTROL_REGISTER ) ;
bySCRControlReg = (UCHAR) ParStlReadReg ( Extension, CONFIG_DATA_REGISTER ) ;
bySCRControlReg |= (UCHAR)PERIPHERAL_RESET_1 ;
ParStlWriteReg ( Extension, CONFIG_DATA_REGISTER , bySCRControlReg ) ;
ParStlWaitForMicroSeconds ( HIFD_WAIT_10_MILLISEC ) ;
ParStlWriteIoPort ( Extension, HIFD_DIGITAL_OUTPUT_REGISTER ,
0x00 ) ;
ParStlWaitForMicroSeconds ( HIFD_WAIT_1_MILLISEC ) ;
ParStlWriteIoPort ( Extension, HIFD_DIGITAL_OUTPUT_REGISTER ,
HIFD_DOR_RESET_BIT | HIFD_ENABLE_DMA_BIT ) ;
ParStlWaitForMicroSeconds ( HIFD_WAIT_10_MILLISEC ) ;
if ( HIFD_CONTROLLER_READY_STATUS == ParStlReadIoPort ( Extension, HIFD_MAIN_STATUS_REGISTER ) )
{
bReturnValue = TRUE ;
}
bySCRControlReg &= ~(UCHAR)PERIPHERAL_RESET_1 ;
ParStlWriteReg ( Extension, CONFIG_DATA_REGISTER , bySCRControlReg ) ;
}
while ( FALSE ) ;
return bReturnValue ;
}
BOOLEAN
ParStlHIFDCheckSMCController (
IN PPDO_EXTENSION Extension
)
{
BOOLEAN bReturnValue = FALSE ;
do
{
ParStlWriteIoPort ( Extension, HIFD_STATUS_REGISTER_A , HIFD_COMMAND_TO_CONTROLLER ) ;
ParStlWriteIoPort ( Extension, HIFD_STATUS_REGISTER_A , HIFD_COMMAND_TO_CONTROLLER ) ;
ParStlWriteIoPort ( Extension, HIFD_STATUS_REGISTER_A , HIFD_CTL_REG_0D ) ;
if ( SMC_DEVICE_ID == ParStlReadIoPort ( Extension, HIFD_STATUS_REGISTER_B ) )
{
bReturnValue = TRUE ;
ParStlWriteIoPort ( Extension, HIFD_STATUS_REGISTER_A , HIFD_CTL_REG_03 ) ;
ParStlWriteIoPort ( Extension, HIFD_STATUS_REGISTER_B , SMC_ENABLE_MODE2 ) ;
}
ParStlWriteReg ( Extension, HIFD_STATUS_REGISTER_A , HIFD_TERMINATE_SEQUENCE ) ;
}
while ( FALSE ) ;
return bReturnValue ;
}
STL_DEVICE_TYPE
ParStlGetImpactDeviceType (
IN PPDO_EXTENSION Extension,
IN OUT PATAPIPARAMS atapiParams,
IN int nPreferredDeviceType
)
{
IMPACT_DEVICE_TYPE idtImpactDeviceType ;
STL_DEVICE_TYPE dtDeviceType = DEVICE_TYPE_NONE ;
ParStlWriteReg ( Extension, CONFIG_INDEX_REGISTER, IMPACT_PERSONALITY_REG ) ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -