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

📄 diskmain.cpp

📁 Ep93XX TionProV2 BSP
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                dwXferMode |= MWDMA_MODE0;
                dwBestXferMode = 0;
            }

            if (m_Id.MultiDmaModesSupported & (1 << 1)) 
            {
                dwCycleTime = MWDMA_MODE1_CYCLE_TIME;
                dwXferMode |= MWDMA_MODE1;
                dwBestXferMode = 1;
            }

            if (m_Id.MultiDmaModesSupported & (1 << 2)) 
            {
                dwCycleTime = MWDMA_MODE2_CYCLE_TIME;
                dwXferMode |= MWDMA_MODE2;
                dwBestXferMode = 2;
            }

            if (m_Id.MultiDmaTransferActive) 
            {
                if (m_Id.MultiDmaTransferActive & IDD_MWDMA_MODE2_ACTIVE) 
                {
                    dwCurrentMode = MWDMA_MODE2;
                } 
                else if (m_Id.MultiDmaTransferActive & IDD_MWDMA_MODE1_ACTIVE) 
                {
                    dwCurrentMode = MWDMA_MODE1;
                }  
                else if (m_Id.MultiDmaTransferActive & IDD_MWDMA_MODE0_ACTIVE) 
                {
                    dwCurrentMode = MWDMA_MODE0;
                }
            }
        }
		

        if (m_Id.TranslationFieldsValid & (1 << 1)) 
        {

            DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData word 64-70 are valid\r\n"), m_dwDevice));

            if (m_Id.MinimumMultiwordDMATime &&  m_Id.ManuRecomendedDMATime) 
            {
                DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData MinimumPIOxferTimeWOFlow = 0x%x\r\n"),                                 
                             m_dwDevice,
                             m_Id.MinimumPIOxferTimeWOFlow));
                DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData ManuRecomendedDMATime = 0x%x\r\n"),
                             m_dwDevice,
                             m_Id.ManuRecomendedDMATime));
                dwCycleTime = m_Id.MinimumPIOxferTimeIORDYFlow;
            }
        }

 */
		m_dwBestMwDmaCycleTime = dwCycleTime;
        m_dwBestMwDmaMode      = dwBestXferMode;

        //
        // figure out the ultra DMA timing the device supports
        //
        dwCycleTime = UNINITIALIZED_CYCLE_TIME;
        dwBestXferMode = UNINITIALIZED_TRANSFER_MODE;

        if (m_Id.TranslationFieldsValid & (1 << 2)) 
        {
            if (m_Id.UltraDMASupport) 
            {
                DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData UltraDMASupport = 0x%x\r\n"),                                 
                             m_dwDevice,
                             m_Id.UltraDMASupport));
                DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData UltraDMAActive = 0x%x\r\n"),                                 
                             m_dwDevice,
                             m_Id.UltraDMAActive));
                if (m_Id.UltraDMASupport & (1 << 0)) 
                {
                    dwCycleTime = UDMA_MODE0_CYCLE_TIME;
                    dwXferMode |= UDMA_MODE0;
                    dwBestXferMode = 0;
                }
                if (m_Id.UltraDMASupport & (1 << 1)) 
                {
                    dwCycleTime = UDMA_MODE1_CYCLE_TIME;
                    dwXferMode |= UDMA_MODE1;
                    dwBestXferMode = 1;
                }
                if (m_Id.UltraDMASupport & (1 << 2)) 
                {
                    dwCycleTime = UDMA_MODE2_CYCLE_TIME;
                    dwXferMode |= UDMA_MODE2;
                    dwBestXferMode = 2;
                }
				// Even the IDE device can support higher UDMA mode than 3,
				// EP931x Rev E1 doesn't support UDMA4 or up.
				// so set UDMA mode to 3.
                //if (m_Id.UltraDMASupport & (1 << 3)) 
                if (m_Id.UltraDMASupport & 0xf8 ) 
                {
                    dwCycleTime = UDMA_MODE3_CYCLE_TIME;
                    dwXferMode |= UDMA_MODE3;
                    dwBestXferMode = 3;
                }
               /* if (m_Id.UltraDMASupport & (1 << 4)) 
                {
                    dwCycleTime = UDMA_MODE4_CYCLE_TIME;
                    dwXferMode |= UDMA_MODE4;
                    dwBestXferMode = 4;
                } */
            }

            if (m_Id.UltraDMAActive) 
            {
               /* if (m_Id.UltraDMAActive & IDD_UDMA_MODE4_ACTIVE) 
                {
                    dwCurrentMode = UDMA_MODE4;
                } 
                else if (m_Id.UltraDMAActive & IDD_UDMA_MODE3_ACTIVE) 
				*/
				// Set UDMA mode up to 3.
				if (m_Id.UltraDMAActive & 0xf8) 
                {
                    dwCurrentMode = UDMA_MODE3;
                } 
                else if (m_Id.UltraDMAActive & IDD_UDMA_MODE2_ACTIVE) 
                {
                    dwCurrentMode = UDMA_MODE2;
                } 
                else if (m_Id.UltraDMAActive & IDD_UDMA_MODE1_ACTIVE) 
                {
                    dwCurrentMode = UDMA_MODE1;
                }  
                else if (m_Id.UltraDMAActive & IDD_UDMA_MODE0_ACTIVE) 
                {
                    dwCurrentMode = UDMA_MODE0;
                }
            }
        }

        //
        // Doesn't really know the ultra dma cycle time
        //
        m_dwBestUDmaCycleTime = dwCycleTime;
        m_dwBestUDmaMode      = dwBestXferMode;

        m_dwTransferModeSupported = dwXferMode;
        m_dwTransferModeCurrent  |= dwCurrentMode;


        DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities target %d transfer timing:\r\n"),m_dwDevice));

        //* * * CAMSDB03/30/04 - Added a '0x' for mode display in all the DEBUGMSG's below.

        DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities PIO mode supported = 0x%04x and best cycle time = %5d ns\r\n"),
                        m_dwTransferModeSupported & PIO_SUPPORT,
                        m_dwBestPioCycleTime));
        DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities SWDMA mode supported = 0x%04x and best cycle time = %5d ns\r\n"),
                        m_dwTransferModeSupported & SWDMA_SUPPORT,
                        m_dwBestSwDmaCycleTime));
        DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities MWDMA mode supported = 0x%04x and best cycle time = %5d ns\r\n"),
                        m_dwTransferModeSupported & MWDMA_SUPPORT,
                        m_dwBestSwDmaCycleTime));
        DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities UDMA mode supported = 0x%04x and best cycle time = %5d ns\r\n"),
                        m_dwTransferModeSupported & UDMA_SUPPORT,
                        m_dwBestUDmaCycleTime));
        
        //* * * CAMSDB03/30/04 - Uncommented the line below (START)
        DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities Current mode bitmap  = %04x\r\n"),
                        m_dwTransferModeCurrent));
        //* * * CAMSDB03/30/04 - Uncommented the line below (END)

    }
} // AnalyzeDeviceCapabilities
// Validate the buffer pointer.
BOOL CDisk::ValidateSg(PSG_REQ pSgReq ,DWORD InBufLen)
{
    if (PSLGetCallerTrust()!= OEM_CERTIFY_TRUST) {
        if  (pSgReq && InBufLen >= (sizeof(SG_REQ) + sizeof(SG_BUF) * (pSgReq->sr_num_sg - 1))) {
            DWORD dwIndex;
            for (dwIndex=0; dwIndex < pSgReq -> sr_num_sg; dwIndex++) {
                pSgReq->sr_sglist[dwIndex].sb_buf = 
                    (PUCHAR)MapCallerPtr((LPVOID)pSgReq->sr_sglist[dwIndex].sb_buf,pSgReq->sr_sglist[dwIndex].sb_len);
            }
        }
        else // Parameter Wrong.
            return FALSE;
    }
    return TRUE;
}
BOOL CDisk::ValidateSg(PCDROM_READ pCdrom ,DWORD InBufLen)
{
    if (PSLGetCallerTrust()!= OEM_CERTIFY_TRUST) {
        if  (pCdrom && InBufLen >= (sizeof(CDROM_READ) + sizeof(SGX_BUF) * (pCdrom->sgcount - 1))) {
            DWORD dwIndex;
            for (dwIndex=0; dwIndex < pCdrom-> sgcount; dwIndex++) {
                pCdrom->sglist[dwIndex].sb_buf = 
                    (PUCHAR)MapCallerPtr((LPVOID)pCdrom->sglist[dwIndex].sb_buf,pCdrom->sglist[dwIndex].sb_len);
            }
        }
        else // Parameter Wrong.
            return FALSE;
    }
    return TRUE;
}
/*------------------------------------------------------------------------------------------*/
BOOL CDisk::PerformIoctl(PIOREQ pIOReq)
{
    DWORD dwError = ERROR_SUCCESS;
    DEBUGMSG( ZONE_IOCTL, (TEXT("ATAPI:PerformIoctl: %x DeviceId: %x \r\n"),pIOReq->dwCode, m_dwDeviceId));

    //* * * CAMSDB040204 - Added this for testing. (START)
    //DEBUGMSG(1, (TEXT("ATAPI:PerformIoctl: %x DeviceId: %x \r\n"),pIOReq->dwCode, m_dwDeviceId));
    //* * * CAMSDB040204 - Added this for testing. (END)

    if (m_dwDeviceFlags & DFLAGS_DEVICE_PWRDN) 
    {
        SetLastError(ERROR_DEVICE_NOT_AVAILABLE);
        return FALSE;
    }   

    if (pIOReq->pBytesReturned)
            *(pIOReq->pBytesReturned)=0;

     TakeCS();
    __try {
        switch( pIOReq->dwCode) {
            case IOCTL_DISK_GETINFO:
            case DISK_IOCTL_GETINFO:
                if (IsCDRomDevice())
                {
                    dwError = ERROR_BAD_COMMAND;
                } 
                else 
                {
                    dwError = GetDiskInfo(pIOReq);
                }   
                break;
            case IOCTL_DISK_DEVICE_INFO:
                dwError = GetDeviceInfo(pIOReq);
                break;
            case DISK_IOCTL_GETNAME  :
            case IOCTL_DISK_GETNAME  :
                dwError=GetDiskName(pIOReq);
                break;
            case DISK_IOCTL_SETINFO :
            case IOCTL_DISK_SETINFO :
                dwError = SetDiskInfo(pIOReq);
                break;
            case DISK_IOCTL_READ    :
            case IOCTL_DISK_READ    :
                if (!ValidateSg((PSG_REQ)pIOReq->pInBuf,pIOReq->dwInBufSize))
                {
                    dwError=ERROR_INVALID_PARAMETER;
                }
                else if (IsReadDMASupported()) 
                {
                    dwError = ReadWriteDiskDMA(pIOReq, TRUE);
                } 
                else 
                {
                    dwError = ReadWriteDisk(pIOReq, TRUE);                      
                }    
                break;
            case DISK_IOCTL_WRITE:
            case IOCTL_DISK_WRITE:
                
                if (!ValidateSg((PSG_REQ)pIOReq->pInBuf,pIOReq->dwInBufSize))
                {
                    dwError=ERROR_INVALID_PARAMETER;
                }
                else if (IsWriteDMASupported()) 
                {
                    dwError = ReadWriteDiskDMA(pIOReq, FALSE);
                } 
                else 
                {
                    dwError = ReadWriteDisk(pIOReq, FALSE);                     
                }    
                break;

            case IOCTL_DISK_GET_STORAGEID:  // this is a new op, so use new codes //
                dwError = GetStorageId(pIOReq);
                break;

            case DISK_IOCTL_FORMAT_MEDIA:
            case IOCTL_DISK_FORMAT_MEDIA:
                dwError = ERROR_SUCCESS;
                break;;
///////////////////// ATAPI  /////////////////////////////////////                
            case IOCTL_CDROM_READ_SG:
            case IOCTL_CDROM_TEST_UNIT_READY:
            case IOCTL_CDROM_DISC_INFO:
            case IOCTL_CDROM_EJECT_MEDIA:
            case IOCTL_CDROM_LOAD_MEDIA:    
///////////////////// DVD ///////////////////////////////////////                
            case IOCTL_DVD_START_SESSION:
            case IOCTL_DVD_READ_KEY:
            case IOCTL_DVD_END_SESSION:
            case IOCTL_DVD_SEND_KEY:
            case IOCTL_DVD_GET_REGION:
///////////////////// CDAUDIO ///////////////////////////////////                
             case IOCTL_CDROM_READ_TOC:
             case IOCTL_CDROM_GET_CONTROL:
             case IOCTL_CDROM_PLAY_AUDIO_MSF:
             case IOCTL_CDROM_SEEK_AUDIO_MSF:
             case IOCTL_CDROM_STOP_AUDIO:
             case IOCTL_CDROM_PAUSE_AUDIO:
             case IOCTL_CDROM_RESUME_AUDIO:
             case IOCTL_CDROM_GET_VOLUME:
             case IOCTL_CDROM_SET_VOLUME:
             case IOCTL_CDROM_READ_Q_CHANNEL:
             case IOCTL_CDROM_GET_LAST_SESSION:
             case IOCTL_CDROM_RAW_READ:
             case IOCTL_CDROM_DISK_TYPE:
             case IOCTL_CDROM_SCAN_AUDIO:
             case IOCTL_CDROM_ISSUE_INQUIRY:
                 if (IsAtapiDevice())
                    dwError = AtapiIoctl(pIOReq);
                else 
                    dwError = ERROR_INVALID_OPERATION;
                break;

             case IOCTL_DISK_USER_GET_DRIVE_STATS:
                if( (pIOReq->pInBuf == NULL) && (pIOReq->dwInBufSize == 0) &&
                   (pIOReq->pOutBuf) && (pIOReq->dwOutBufSize == sizeof(UserDriveStatistics)))
                {
                    dwError = GetUserDriveStatistics((UserDriveStatistics *)pIOReq->pOutBuf);
                    *(pIOReq->pBytesReturned) = sizeof(UserDriveStatistics);
                }
                break;

              case IOCTL_DISK_USER_GET_DRIVE_IDENTIFY:
                if( (pIOReq->pInBuf == NULL) &&  (pIOReq->dwInBufSize == 0) &&
                   (pIOReq->pOutBuf) && (pIOReq->dwOutBufSize == sizeof(IDENTIFY_DATA)))
                {
                    dwError = GetDriveIdentifyData((IDENTIFY_DATA *)pIOReq->pOutBuf);
                    *(pIOReq->pBytesReturned) = sizeof(IDENTIFY_DATA);
                }
                break;

              case IOCTL_DISK_USER_SET_TRANSFER_MODE:
                if( (pIOReq->pInBuf) && (pIOReq->dwInBufSize == sizeof(UserUdmaSettings)) &&
                   (pIOReq->pOutBuf == NULL) && (pIOReq->dwOutBufSize == 0) )
                {
                    UserUdmaSettings *pSettings = (UserUdmaSettings *)pIOReq->pInBuf;
                    dwError = ForceTransferMode(pSettings->fUDMAEnable, pSettings->ulBestUDmaModeReg);
                }
                break;

            default:
                dwError = ERROR_NOT_SUPPORTED;
                break;
        }
    } __except(EXCEPTION_EXECUTE_HANDLER) {
        dwError = ERROR_GEN_FAILURE;
    }
    ReleaseCS();
    if (dwError != ERROR_SUCCESS) 
        SetLastError( dwError);
    return ERROR_SUCCESS == dwError;
}


/*------------------------------------------------------------------------------------------*/
BOOL CDisk::PostInit(PPOST_INIT_BUF pPostInitBuf)
{
    DWORD dwError=ERROR_SUCCESS;

    DEBUGMSG( ZONEID_INIT, (TEXT("ATAPI: PostInit ( Device :0x%x) \r\n"),m_dwDeviceId));
    m_hDevice = pPostInitBuf->p_hDevice;
    return dwError == ERROR_SUCCESS;
}    

/*------------------------------------------------------------------------------------------*/
DWORD CDisk::GetDiskInfo(PIOREQ pIOReq)
{
    DWORD dwError = ERROR_SUCCESS;
    DISK_INFO *pInfo = NULL;

// The Call can come in three flavors (BC).  Just inbuf is specified, outbuf is specified or both.  If both then outbuf is used

⌨️ 快捷键说明

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