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

📄 diskmain.cpp

📁 EP931X系列的WinCE显卡驱动源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
        m_dwDeviceFlags |=DFLAGS_DEVICE_CDROM;
    }

    DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:Identify Completed Stage 1 Status=%02X\r\n"),GetAltStatus()));

    m_dwDeviceFlags |= DFLAGS_DEVICE_PRESENT;
    m_dwDeviceFlags |= (IsAtapiDevice()) ? DFLAGS_ATAPI_DEVICE : 0;
    m_dwDeviceFlags |= (IsRemoveableDevice()) ? DFLAGS_REMOVABLE_DRIVE : 0;

    AnalyzeDeviceCapabilities();

    SetBestTransferMode();

    if (IsAtapiDevice()) 
    {
        // TODO:    
//      AtapiSetInfo();
    } else {

        //
        //  Set Multiple Mode if ATA Device
        //
        m_bSectorsPerBlock= 1;

    }

    m_fLBAMode = (m_Id.Capabilities & 0x0200) ? TRUE : FALSE;
//    m_fLBAMode = TRUE;

    DWORD dwCHS = 0;
    if (AtaGetRegistryValue(m_hDevKey, REG_VALUE_CHS, &dwCHS) && (dwCHS == 1)) {
        m_fLBAMode = FALSE;    
    }
    
    

//    if (!(m_Id.GeneralConfiguration & 0x8000)) {    
    if (!IsAtapiDevice()) {
        m_bReadCommand = ATA_CMD_READ ;
        m_bWriteCommand = ATA_CMD_WRITE ;
        
        if (m_Id.MaximumBlockTransfer != 0){
            SelectDevice();
            WriteSectorCount( (BYTE)m_Id.MaximumBlockTransfer) ;
            WriteCommand(ATA_CMD_SET_MULTIPLE);

            if (!WaitOnBusy(FALSE) && (GetAltStatus() & ATA_STATUS_READY)) {
                m_bReadCommand = ATA_CMD_MULTIPLE_READ ;
                m_bWriteCommand = ATA_CMD_MULTIPLE_WRITE ;
                m_bSectorsPerBlock = m_Id.MaximumBlockTransfer;
            }
        }    
        DEBUGMSG( ZONE_INIT, (TEXT("ATAPI: Idenitfy - MultipleMode Set to= %ld Sectors\r\n"),m_Id.MaximumBlockTransfer));
    }
    m_DiskInfo.di_bytes_per_sect = BYTES_PER_SECTOR; // Start with 512, then go with SetInfo changes
    if (m_Id.NumberOfCurrentCylinders) {
        m_DiskInfo.di_cylinders = m_Id.NumberOfCylinders;
    } else {
        if (!AtaGetRegistryValue(m_hDevKey, TEXT("Cylinders"), &(m_DiskInfo.di_cylinders))) {
            AtaGetRegistryValue(m_hDevKey, TEXT("Cyl"), &(m_DiskInfo.di_cylinders));
        }
    }
    if (m_Id.NumberOfCurrentHeads) {
        m_DiskInfo.di_heads = m_Id.NumberOfCurrentHeads;
    } else {
        AtaGetRegistryValue(m_hDevKey, TEXT("Heads"), &(m_DiskInfo.di_heads));
    }
    if (m_Id.CurrentSectorsPerTrack) {
        m_DiskInfo.di_sectors = m_Id.CurrentSectorsPerTrack;
    } else {
        if (!AtaGetRegistryValue(m_hDevKey, TEXT("SectorsPerTrack"), &(m_DiskInfo.di_sectors))) {
            AtaGetRegistryValue(m_hDevKey, TEXT("spt"), &(m_DiskInfo.di_sectors));  // Shortcut for dev
        }    
        
    }
    if (m_Id.TotalUserAddressableSectors) {
        m_DiskInfo.di_total_sectors = m_Id.TotalUserAddressableSectors;
    } else {    
//      m_DiskInfo.di_total_sectors= m_Id.NumberOfCylinders*m_Id.NumberOfCurrentHeads*m_Id.CurrentSectorsPerTrack;  
        m_DiskInfo.di_total_sectors= m_DiskInfo.di_cylinders*m_DiskInfo.di_heads*m_DiskInfo.di_sectors; 
    }   
    m_DiskInfo.di_flags = DISK_INFO_FLAG_MBR;

    
    DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:Identify Completed Stage 2 Status=%02X\r\n"),GetAltStatus()));
    return TRUE;
}

/*------------------------------------------------------------------------------------------*/

void CDisk::AnalyzeDeviceCapabilities ()
{

    DWORD dwCycleTime;
    DWORD dwXferMode;
    DWORD dwBestXferMode;
    DWORD dwCurrentMode;
    BOOL   fIoReadyEnabled;

    //
    // Figure out who can do DMA and who cannot
    //
   
    if (m_dwDeviceFlags & DFLAGS_DEVICE_PRESENT) {

        //
        // check LBA capabilities
        //
        //CLRMASK (m_dwDeviceFlags, DFLAGS_LBA);

        dwXferMode  = 0;
        dwCycleTime = UNINITIALIZED_CYCLE_TIME;
        dwBestXferMode = 0;

        //
        // check for IoReady Line
        //
        if (m_Id.Capabilities & IDENTIFY_CAPABILITIES_IOREADY_SUPPORTED) {

            fIoReadyEnabled = TRUE;

        } else {

            fIoReadyEnabled = FALSE;
        }

        //
        // Check for PIO mode
        //
        if ((m_Id.MinimumPIOxferTimeWOFlow & 0x00ff) == 2) {

            dwCycleTime = PIO_MODE2_CYCLE_TIME;
            dwXferMode |= PIO_MODE2 | PIO_MODE1 | PIO_MODE0;
            dwBestXferMode = 2;
            dwCurrentMode = PIO_MODE2;

        } else if ((m_Id.MinimumPIOxferTimeWOFlow & 0x00ff) == 1) {

            dwCycleTime = PIO_MODE1_CYCLE_TIME;
            dwXferMode |= PIO_MODE1 | PIO_MODE0;
            dwBestXferMode = 1;
            dwCurrentMode = PIO_MODE1;

        } else {

            dwCycleTime = PIO_MODE0_CYCLE_TIME;
            dwXferMode |= PIO_MODE0;
            dwBestXferMode = 0;
            dwCurrentMode = PIO_MODE0;
        }

        DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities target %d IdentifyData PioCycleTimingMode (highest pio mode) = 0x%x\r\n"),
                     m_dwDevice,
                     m_Id.MinimumPIOxferTimeWOFlow));

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

            if (fIoReadyEnabled) {
                dwCycleTime = m_Id.MinimumPIOxferTimeIORDYFlow;
            } else {
                dwCycleTime = m_Id.MinimumPIOxferTimeWOFlow;
            }

            if (m_Id.AdvancedPIOxferreserved & (1 << 0)) {
                dwXferMode |= PIO_MODE3;
                dwBestXferMode = 3;
                dwCurrentMode = PIO_MODE3;
            }

            if (m_Id.AdvancedPIOxferreserved & (1 << 1)) {
                dwXferMode |= PIO_MODE4;
                dwBestXferMode = 4;
                dwCurrentMode = PIO_MODE4;
            }

            DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities target %d IdentifyData AdvancedPIOModes = 0x%x\r\n"),
                         m_dwDevice,
                         m_Id.AdvancedPIOxferreserved));
        }

        ASSERT (dwCycleTime != UNINITIALIZED_CYCLE_TIME);
        ASSERT (dwXferMode);
        ASSERT (dwCurrentMode);
        
        m_dwBestPioCycleTime      = dwCycleTime;
        m_dwBestPioMode           = dwBestXferMode;

        //
        // figure out all the DMA transfer mode this device supports
        //
        dwCurrentMode = 0;

        //
        // check singleword DMA timing
        //
        dwCycleTime = UNINITIALIZED_CYCLE_TIME;
        dwBestXferMode = UNINITIALIZED_TRANSFER_MODE;

        if (m_Id.SingleDmaModesSupported) {
            DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData SingleDmaModesSupported = 0x%x\r\n"),                         
                         m_dwDevice,
                         m_Id.SingleDmaModesSupported));

            DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData SingleWordDMAActive = 0x%x\r\n"),
                         m_dwDevice,
                         m_Id.SingleDmaTransferActive));

            if (m_Id.SingleDmaModesSupported & (1 << 0)) {
                dwCycleTime = SWDMA_MODE0_CYCLE_TIME;
                dwXferMode |= SWDMA_MODE0;
                dwBestXferMode = 0;
            }
            if (m_Id.SingleDmaModesSupported & (1 << 1)) {
                dwCycleTime = SWDMA_MODE1_CYCLE_TIME;
                dwXferMode |= SWDMA_MODE1;
                dwBestXferMode = 1;
            }
            if (m_Id.SingleDmaModesSupported & (1 << 2)) {
                dwCycleTime = SWDMA_MODE2_CYCLE_TIME;
                dwXferMode |= SWDMA_MODE2;
                dwBestXferMode = 2;
            }

            if (m_Id.SingleDmaTransferActive) {

                if (m_Id.SingleDmaTransferActive & IDD_SWDMA_MODE2_ACTIVE) {
                    dwCurrentMode = SWDMA_MODE2;
                } else if (m_Id.SingleDmaTransferActive & IDD_SWDMA_MODE1_ACTIVE) {
                    dwCurrentMode = SWDMA_MODE1;
                }  else if (m_Id.SingleDmaTransferActive & IDD_SWDMA_MODE0_ACTIVE) {
                    dwCurrentMode = SWDMA_MODE0;
                }
            }
        }

        m_dwBestSwDmaCycleTime    = dwCycleTime;
        m_dwBestSwDmaMode         = dwBestXferMode;

        //
        // check multiword DMA timing
        //
        dwCycleTime = UNINITIALIZED_CYCLE_TIME;
        dwBestXferMode = UNINITIALIZED_TRANSFER_MODE;

        if (m_Id.MultiDmaModesSupported) {
            DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData MultiWordDMASupport = 0x%x\r\n"),                             
                         m_dwDevice,
                         m_Id.MultiDmaModesSupported));
            DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData MultiWordDMAActive = 0x%x\r\n"),                
                         m_dwDevice,
                         m_Id.SingleDmaTransferActive));

            if (m_Id.MultiDmaModesSupported & (1 << 0)) {
                dwCycleTime = MWDMA_MODE0_CYCLE_TIME;
                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;
                }

⌨️ 快捷键说明

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