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

📄 ct69000.cpp

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 CPP
📖 第 1 页 / 共 4 页
字号:
                {
                    DEBUGMSG( CT69K_ZONE_INIT, 
                          (TEXT("found ct69030 at %08x on bus %d slot %d\r\n"), 
                                pciConfig.u.type0.BaseAddresses[0], ulBusNumber, ulSlotNumber));
                } else
                {
                    DEBUGMSG( CT69K_ZONE_INIT, 
                         (TEXT("found ct69000 at %08x on bus %d slot %d\r\n"), 
                                pciConfig.u.type0.BaseAddresses[0], ulBusNumber, ulSlotNumber));
                }

                if (ulBoard!=N_DISPLAY)
                {
                    continue;
                }

                if (pciConfig.DeviceID==CT69030_DEVICEID)
                {
                    m_ulVideoMemorySize=CT69030_VIDEOMEMORYSIZE;
                    m_bChip69030=TRUE;
                }

                //
                //  set memory access bit if not set!
                //
                if (!(pciConfig.Command & 2))
                {
                    // oops. BIOS didn't give us permission to access memory
                    pciConfig.Command |= 2;

                    ulResult=
                    HalSetBusDataByOffset(
                        PCIConfiguration,
                        ulBusNumber,
                        ulSlotNumber,
                        (PBYTE)&pciConfig.Command,
                        (PBYTE)&pciConfig.Command-(PBYTE)&pciConfig,
                        sizeof(pciConfig.Command));

                    DEBUGMSG(CT69K_ZONE_INIT, 
                        (TEXT("--enabled memory access for this device\r\n")));

                }

                // CT69000 maps only one region in PCI memory space
                m_ulPhysFrameBuffer = pciConfig.u.type0.BaseAddresses[0];

                m_bHasVGARegs=pciConfig.Command & 1;

                if (m_bHasVGARegs)
                {
                    DEBUGMSG(CT69K_ZONE_INIT, 
                        (TEXT("--this ct690x0 has VGA ports\r\n")));
                }

                break;
            }
        }
    }
#else
    //
    // read device and vendor id via I/O ports
    //
    WORD  wVendorId=GetXRPort(0) | (GetXRPort(1) << 8);
    WORD  wDeviceId=GetXRPort(2) | (GetXRPort(3) << 8);

    if (wVendorId==CT69000_VENDORID &&
        (wDeviceId==CT69000_DEVICEID ||
         wDeviceId==CT69030_DEVICEID))
    {
        WORD  wRevision=GetXRPort(4);
        m_ulPhysFrameBuffer=GetXRPort(5) | (GetXRPort(6) << 8); 
        m_ulPhysFrameBuffer <<= 16;

        //
        //  C&T 69030 has 4MB memory!!!
        //
        if (wDeviceId==CT69030_DEVICEID)
        {
            m_ulVideoMemorySize=CT69030_VIDEOMEMORYSIZE;
            m_bChip69030=TRUE;

            DEBUGMSG( CT69K_ZONE_INIT, 
                      (TEXT("found ct69030 rev %d at %08x"), 
                      wRevision, m_ulPhysFrameBuffer));
        } else
        {
            DEBUGMSG( CT69K_ZONE_INIT, 
                      (TEXT("found ct69000 rev %d at %08x"), 
                      wRevision, m_ulPhysFrameBuffer));
        }

    } 
#endif

    // set 4k region for cursors to end of memory 
    m_ulCursorMemory = m_ulVideoMemorySize-CT69000_CURSOR_SPACE;
    m_ulPatternMemory = m_ulCursorMemory-CT69000_PATTERN_SPACE;

    if (m_ulPhysFrameBuffer!=NULL)
    {
        // allocate memory region for frame buffer
        m_pFrameBuffer = (PUCHAR) 
            VirtualAlloc(
            0, 
            m_ulVideoMemorySize, 
            MEM_RESERVE, 
            PAGE_NOACCESS);

        // allocate memory region for frame buffer
        m_pCtrlRegister = (PUCHAR) 
            VirtualAlloc(
            0, 
            CT69000_CTRLREGSIZE, 
            MEM_RESERVE, 
            PAGE_NOACCESS);

        // assign frame buffer to physical address space
        // note: when we use the PAGE_PHYSICAL flag in VirtualCopy, 
        // the physical address must be divided by 256
        //
        VirtualCopy(m_pFrameBuffer, 
                    (LPVOID) (m_ulPhysFrameBuffer >> 8), 
                    m_ulVideoMemorySize, 
                    PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL);

        // assign control registers to physical address space
        VirtualCopy(m_pCtrlRegister, 
                    (LPVOID) ((m_ulPhysFrameBuffer+CT69000_CTRLREGOFFSET)>>8), 
                    CT69000_CTRLREGSIZE, 
                    PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL);

#if DEBUG
        //
        //  on debugging, let us know that we can access the framebuffer...
        //
        for (INT i=0;i<256;i+=4)
        {
            memset ( m_pFrameBuffer, i, m_ulVideoMemorySize);
        }
        memset ( m_pFrameBuffer, 0x80, m_ulVideoMemorySize);

#if BIOSSETUP
        if (m_bChip69030)
        {
            DEBUGMSG(CT69K_ZONE_INIT, (TEXT("//69030 IOSS\r\n")));
            DEBUGMSG(CT69K_ZONE_INIT, (TEXT("//IOSS: 0x%02x\r\n"), READ_PORT_UCHAR((PUCHAR)0x3cd)));
            DEBUGMSG(CT69K_ZONE_INIT, (TEXT("//69030 MSS\r\n")));
            DEBUGMSG(CT69K_ZONE_INIT, (TEXT("//MSS:  0x%02x\r\n"), READ_PORT_UCHAR((PUCHAR)0x3cb)));
        }
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("//\r\n")));
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// mode %ldx%ldx%ld\r\n"), gpeMode.width, gpeMode.height, gpeMode.Bpp ));
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("//\r\n")));
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("VGAPortData vgamode%ldx%ldx%ld[] =\r\n"), gpeMode.width, gpeMode.height, gpeMode.Bpp ));
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("{\r\n")));
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("{0x03c4,0x0000,0x0000},// force reset\r\n")));
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("{0x03c4,0x0000,0x0003},// clear reset\r\n")));
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("{0x03d4,0x0011,0x000c},// unlock CR0..7 first\r\n")));
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// SR register\r\n")));
        ListRegs( VGA_SR_BASE,    0, 4);
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// GR register\r\n")));
        ListRegs( VGA_GR_BASE,    0, 8);
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// AR register\r\n")));
        ListRegs( VGA_AR_BASE, 0x20, 0x34);
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// CR register\r\n")));
        ListRegs( VGA_CR_BASE,    0, 0x10);
        ListRegs( VGA_CR_BASE, 0x12, 0x18);
        ListRegs( VGA_CR_BASE, 0x30, 0x33);
        ListRegs( VGA_CR_BASE, 0x38, 0x38);
        ListRegs( VGA_CR_BASE, 0x3c, 0x3c);
        ListRegs( VGA_CR_BASE, 0x40, 0x41);
        ListRegs( VGA_CR_BASE, 0x70, 0x79);
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// XR register\r\n")));
        ListRegs( VGA_XR_BASE, 0x00, 0x0e);
        ListRegs( VGA_XR_BASE, 0x20, 0x20);
        ListRegs( VGA_XR_BASE, 0x40, 0x4f);
        ListRegs( VGA_XR_BASE, 0x60, 0x63);
        ListRegs( VGA_XR_BASE, 0x67, 0x67);
        ListRegs( VGA_XR_BASE, 0x70, 0x71);
        ListRegs( VGA_XR_BASE, 0x80, 0x82);
        ListRegs( VGA_XR_BASE, 0xcf, 0xd1);
        ListRegs( VGA_XR_BASE, 0xc0, 0xc1);
        ListRegs( VGA_XR_BASE, 0xc3, 0xc5);
        ListRegs( VGA_XR_BASE, 0xc7, 0xc9);
        ListRegs( VGA_XR_BASE, 0xcb, 0xce);
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// FR register\r\n")));
        ListRegs( VGA_FR_BASE, 0x00, 0x4e);
        ListRegs( VGA_FR_BASE, 0x70, 0x74);
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("// MSR register\r\n")));
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("{0x03c2,0x00ff,0x%02x},\r\n"), READ_PORT_UCHAR((PUCHAR)VGA_MSR_REG)));
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("{0,0,0}\r\n")));
        DEBUGMSG(CT69K_ZONE_INIT, (TEXT("};\r\n")));
#endif //BIOSSETUP
#endif //DEBUG

    } 
    else
    {
        //
        //  fatal error...
        //
        RETAILMSG(CT69K_ZONE_INIT, (TEXT("*** ct69000/030 not found! ***\r\n")));
    }

    DEBUGMSG(CT69K_ZONE_INIT, (TEXT("CT69000::CT69000 done!\r\n")));

}


//-----------------------------------------------------------------------
//
//
//
//-----------------------------------------------------------------------

CT69000::~CT69000()
{
#if DXPAK
    if (hDDStub)
    {
        FreeLibrary(hDDStub);
        hDDStub = NULL;
    }
#endif
    VirtualFree( m_pFrameBuffer, 0, MEM_RELEASE);
    m_pFrameBuffer=NULL;
    VirtualFree( m_pCtrlRegister, 0, MEM_RELEASE);
    m_pCtrlRegister=NULL;
}

//-----------------------------------------------------------------------
//
//  CT69000::GetGraphicsCaps
//
//  get driver graphic caps for gdi.
//
//-----------------------------------------------------------------------

ULONG	
CT69000::GetGraphicsCaps()
{
    ULONG ulGraphCaps= GPE::GetGraphicsCaps();
	
	if (m_pMode)
	{
		if (m_pMode->Bpp == 16)		// if in 16bpp mode, return GCAPS_GRAY16 to denote that we support anti-aliased fonts
		{
			ulGraphCaps |= GCAPS_GRAY16;
		}

#if FIXED_PALETTE

		if (m_pMode->Bpp == 8)
		{
			ulGraphCaps |= GCAPS_GRAY16;;
		}

#endif

	}
	
	return ulGraphCaps;
}

//-----------------------------------------------------------------------
//
//  CT69000::IsPaletteSettable
//
//  return false for fixed palette, otherwise return default 
//
//-----------------------------------------------------------------------

int 
CT69000::IsPaletteSettable()
{

#if FIXED_PALETTE

	if (m_pMode)
	{
		if (m_pMode->Bpp == 8)
		{
			return FALSE;
		}
	}

#endif

	return GPE::IsPaletteSettable();
}


//-----------------------------------------------------------------------
//
//  CT69000::SetMode
//
//  set video mode according to the mode list.
//
//-----------------------------------------------------------------------
SCODE 
CT69000::SetMode(INT modeId, HPALETTE *pPalette)
{
    PULONG pulBitMask;
    SCODE  sc;

    DEBUGMSG(CT69K_ZONE_INIT, (TEXT("CT69000::SetMode\r\n")));

    //
    //  fail SetMode if we failed to initialize
    //
    if (m_pFrameBuffer==NULL)
        return E_OUTOFMEMORY;

#if !BIOSSETUP
    //
    // The mode is already set, just return
    //
    if (m_pMode)    
        return S_OK;
#endif

    //
    //  if user selects mode Id out of range, 
    //  start in defaul mode
    //
    if (modeId >= NumModes()) 
        modeId = 0;

    //
    //  note: currently we always get called with mode 0 ??
    //
    modeId = m_ulVideoMode;

    gpemodes[modeId]->frequency = m_ulRefreshRate;
    m_pMode = gpemodes[modeId];

    //
    // select proper bitmask (hardcoded in FBBPP)
    //
    pulBitMask=ulBitMask;

    m_ulBitMasks[0] = pulBitMask[0];
    m_ulBitMasks[1] = pulBitMask[1];
    m_ulBitMasks[2] = pulBitMask[2];

    m_nScreenWidth  = m_pMode->width;
    m_nScreenHeight = m_pMode->height;
    m_nScreenBpp    = m_pMode->Bpp;
    m_nScreenBytesPerPixel = m_pMode->Bpp / 8;
    m_nScreenStride = m_nScreenWidth * m_nScreenBytesPerPixel;

    DEBUGMSG(CT69K_ZONE_INIT, (TEXT(
    "mode=%d modeID=%d width=%d height=%d stride=%d\r\n"),
        modeId, m_pMode->modeId, m_nScreenWidth, m_nScreenHeight, 
    m_nScreenStride));

    //
    // create video memory heap
    //
    // force allocations to align to 128 bits/16 byte
    // otherwise there were artifacts in the TextOut1bpp function
    // when writing on a misaligned surface? (chip bug?)
    //
    // we reserve memory for the cursor and the brush here, 
    // they don't need to be managed
    // 
    m_pVMHeap = new LinHeap ( m_ulVideoMemorySize-
                              CT69000_CURSOR_SPACE-
                              CT69000_PATTERN_SPACE,
                              16);

    if (m_pVMHeap==NULL) return E_OUTOFMEMORY;
    
    if (FAILED(sc = AllocSurface(  &m_pPrimarySurface, 
                                    m_nScreenWidth, 
                                    m_nScreenHeight, 
                                    m_pMode->format, 
                                    GPE_REQUIRE_VIDEO_MEMORY)))
        return sc;

#if !BIOSSETUP    
    SetDisplayMode(vgamodes[modeId]);
    SetRefreshRate(m_ulRefreshRate);
#else
	//
	//the following statement caused no VGA output on some platforms
	//
    //WRITE_LIN_UCHAR( VGA_MSR_REG, 3);      // set regs to CGA emulation (3dx)
    SetXR( 9, 1);
    SetXR( 0xa, 2);                        // enable linear frame buffer, disable a0000 window
    SetXR( 0xb, 9);                        // enable pci bursts, disable for text expansion
    SetXR( 0x20, 2);                       // reset blt engine
    SetXR( 0x40, 3);                       // high res modes, no wrap!
#endif

#if DEBUG
    //
    //  on debugging, let us know that we can access the framebuffer...
    //
    for (INT i=0;i<256;i+=8)
    {
        memset ( m_pFrameBuffer, i, m_ulVideoMemorySize);
    }
    memset ( m_pFrameBuffer, 0, m_ulVideoMemorySize);
#endif

    // Clear the screen
    memset((PUCHAR) m_pPrimarySurface->Buffer(), 
                    0, 
                    m_pMode->width * 
                    m_pMode->height * 
                    (m_pMode->Bpp >> 3));

    // Here, we use EngCreatePalette to create a palette that 
    // MGDI will use as a stock palette
    if (pPalette)
    {
        if (m_pMode->format==gpe8Bpp)
        {
            *pPalette = EngCreatePalette(PAL_INDEXED, 
                PALETTE_SIZE, 
                (PULONG)_rgbIdentity, 0, 0, 0);
            DEBUGMSG(CT69K_ZONE_INIT, (
                TEXT("Created 8 Bpp palette, handle = 0x%08x\r\n"), *pPalette));
            SetPalette (_rgbIdentity, 0, 256);
        } else
        {
            // 15,16,24, and 32bpp primaries are defined by red,green, and blue bitfields...
            *pPalette = EngCreatePalette
                (
                PAL_BITFIELDS,
                0, 
                NULL,
                m_ulBitMasks[0],
                m_ulBitMasks[1],
                m_ulBitMasks[2]
                );
            DEBUGMSG(CT69K_ZONE_INIT, (
                TEXT("Created bitfield handle (%02x,%02x,%02x)= 0x%08x\r\n"), 
                m_ulBitMasks[0],m_ulBitMasks[1],m_ulBitMasks[2],*pPalette));
        }
    }

    //
    //  reset and disable cursor 1
    //
    m_pCursorMemory = m_pFrameBuffer+m_ulCursorMemory;
    m_pPatternMemory= m_pFrameBuffer+m_ulPatternMemory;

    
    // reset blt engine
    switch (m_pMode->format)
    {
    case gpe24Bpp: m_ucBitBlt=0x20; break;
    case gpe16Bpp: m_ucBitBlt=0x10; break;
    default:
    case gpe8Bpp: m_ucBitBlt=0x0; break;
    }

    SetXR( 0x20, m_ucBitBlt|2);
    SetXR( 0x20, m_ucBitBlt);

    // setup base address for pattern data
    SetBR( 5, m_ulPatternMemory);

    // set up base address for cursor 1
    SetXR(CT69000_CURSOR1_BASEADDRESSLOW,(UCHAR) ((m_ulCursorMemory >> 8) & 0xf0)); 
    SetXR(CT69000_CURSOR1_BASEADDRESSHIGH, (UCHAR) (m_ulCursorMemory >> 16));   

    //
    //  turn off cursor for now....
    //
    DisableCursor();

#if DXPAK
    //
    //  reset overlay for DirectX
    //

    ResetOverlay();
  
#endif

    DEBUGMSG(CT69K_ZONE_INIT, (TEXT("Leaving CT69000::SetMode\r\n")));
    return S_OK;
}


//-----------------------------------------------------------------------
//
//  CT69000::GetModeInfo
//
//  GPE calls this function to build its mode table
//
//-----------------------------------------------------------------------
SCODE 
CT69000::GetModeInfo(GPEMode *pMode, int modeNo)
{
    DEBUGMSG(CT69K_ZONE_FUNCTION, (TEXT(
    "CT69000::GetModeInfo(modeNo=%d)\r\n"), modeNo));
    
    if (modeNo < 0 || modeNo >= NumModes())
        return E_INVALIDARG;

    //
    //  note: remove this when loadcepc can pass more than five video modes

⌨️ 快捷键说明

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