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

📄 vga_gu1.c

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 C
📖 第 1 页 / 共 2 页
字号:
            /* SET PROPER COLOR DEPTH VALUE */
            /* CRTC_EXTENDED_COLOR_CONTROL index is 0x46, so offset = 0x06 */

            switch(bpp)
            {
            case 15:
                vga->extCRTCregs[0x06] = CRTC_BIT_16BPP | CRTC_BIT_555;
                break;
            case 16:
                vga->extCRTCregs[0x06] = CRTC_BIT_16BPP;
                break;
            default:
                vga->extCRTCregs[0x06] = 0;
                break;
            }
            return(GFX_STATUS_OK);
        }
    }
    return(GFX_STATUS_UNSUPPORTED);
}

/*-----------------------------------------------------------------------------
 * gfx_vga_pitch
 *
 * This routine updates the VGA regisers in the specified VGA structure for 
 * the specified pitch.  It does not program the hardware.
 *-----------------------------------------------------------------------------
 */
int gfx_vga_pitch(gfx_vga_struct *vga, unsigned short pitch)
{
    pitch >>= 3;
    vga->stdCRTCregs[0x13] = (unsigned char) pitch;
    vga->extCRTCregs[0x05] = ((pitch >> 8) & 0x03);
    return(0);
}

/*-----------------------------------------------------------------------------
 * gfx_vga_save
 *
 * This routine saves the state of the VGA registers into the specified 
 * structure.  Flags indicate what portions of the register state need to 
 * be saved.
 *-----------------------------------------------------------------------------
 */
int gfx_vga_save(gfx_vga_struct *vga, int flags)
{
    int i;
    unsigned short crtcindex, crtcdata;
    crtcindex = (INB(0x3CC) & 0x01) ? 0x3D4 : 0x3B4;
    crtcdata = crtcindex + 1;   

    /* CHECK MISCELLANEOUS OUTPUT FLAG */

    if (flags & GFX_VGA_FLAG_MISC_OUTPUT)
    {
        /* SAVE MISCCELLANEOUS OUTPUT REGISTER */

        vga->miscOutput = INB(0x3CC);
    }

    /* CHECK STANDARD CRTC FLAG */

    if (flags & GFX_VGA_FLAG_STD_CRTC)
    {
        /* SAVE STANDARD CRTC REGISTERS */

        for (i = 0; i < GFX_STD_CRTC_REGS; i++)
        {
            OUTB(crtcindex, (unsigned char) i);
            vga->stdCRTCregs[i] = INB(crtcdata);
        }
    }

    /* CHECK EXTENDED CRTC FLAG */

    if (flags & GFX_VGA_FLAG_EXT_CRTC)
    {
        /* SAVE EXTENDED CRTC REGISTERS */

        for (i = 0; i < GFX_EXT_CRTC_REGS; i++)
        {
            OUTB(crtcindex, (unsigned char) (0x40+i));
            vga->extCRTCregs[i] = INB(crtcdata);
        }
    }
    return(0);
}

/*-----------------------------------------------------------------------------
 * gfx_vga_clear_extended
 *
 * This routine clears the extended SoftVGA register values to have SoftVGA
 * behave like standard VGA. 
 *-----------------------------------------------------------------------------
 */
void gfx_vga_clear_extended(void)
{
    int i;
    unsigned short crtcindex, crtcdata;
    crtcindex = (INB(0x3CC) & 0x01) ? 0x3D4 : 0x3B4;
    crtcdata = crtcindex + 1;   

    OUTB(crtcindex, 0x30);
    OUTB(crtcdata, 0x57);
    OUTB(crtcdata, 0x4C);
    for (i = 0x40; i <= 0x4F; i++)
    {
        OUTB(crtcindex, (unsigned char) i);
        OUTB(crtcdata, 0);
    }
    OUTB(crtcindex, 0x30);
    OUTB(crtcdata, 0x00);
}

/*-----------------------------------------------------------------------------
 * gfx_vga_restore
 *
 * This routine restores the state of the VGA registers from the specified
 * structure.  Flags indicate what portions of the register state need to 
 * be saved.
 *-----------------------------------------------------------------------------
 */
int gfx_vga_restore(gfx_vga_struct *vga, int flags)
{
    int i;
    unsigned short crtcindex, crtcdata;
    crtcindex = (INB(0x3CC) & 0x01) ? 0x3D4 : 0x3B4;
    crtcdata = crtcindex + 1;   

    /* CHECK MISCELLANEOUS OUTPUT FLAG */

    if (flags & GFX_VGA_FLAG_MISC_OUTPUT)
    {
        /* RESTORE MISCELLANEOUS OUTPUT REGISTER VALUE */

        OUTB(0x3C2, vga->miscOutput);
    }

    /* CHECK STANDARD CRTC FLAG */

    if (flags & GFX_VGA_FLAG_STD_CRTC)
    {
        /* UNLOCK STANDARD CRTC REGISTERS */

        OUTB(crtcindex, 0x11); 
        OUTB(crtcdata, 0);

        /* RESTORE STANDARD CRTC REGISTERS */

        for (i = 0; i < GFX_STD_CRTC_REGS; i++)
        {
            OUTB(crtcindex, (unsigned char) i); 
            OUTB(crtcdata, vga->stdCRTCregs[i]);
        }
    }
    
    /* CHECK EXTENDED CRTC FLAG */

    if (flags & GFX_VGA_FLAG_EXT_CRTC)
    {
        /* UNLOCK EXTENDED CRTC REGISTERS */

        OUTB(crtcindex, 0x30); 
        OUTB(crtcdata, 0x57);
        OUTB(crtcdata, 0x4C);

        /* RESTORE EXTENDED CRTC REGISTERS */

        for (i = 0; i < GFX_EXT_CRTC_REGS; i++)
        {
            OUTB(crtcindex, (unsigned char) (0x40+i)); 
            OUTB(crtcdata, vga->extCRTCregs[i]);
        }

        /* LOCK EXTENDED CRTC REGISTERS */

        OUTB(crtcindex, 0x30); 
        OUTB(crtcdata, 0x00);

        /* CHECK IF DIRECT FRAME BUFFER MODE (VESA MODE) */

        if (vga->extCRTCregs[0x03] & 1)
        {
            /* SET BORDER COLOR TO BLACK */
            /* This really should be another thing saved/restored, but */
            /* Durango currently doesn't do the attr controller registers. */

            INB(0x3BA); /* Reset flip-flop */
            INB(0x3DA);
            OUTB(0x3C0, 0x31);
            OUTB(0x3C0, 0x00);
        }
    }
    return(0);
}

/*-----------------------------------------------------------------------------
 * gfx_vga_mode_switch
 *
 * This routine programs the SoftVGA register to indicate that a mode switch
 * is in progress.  This results in a cleaner mode switch since SoftVGA will 
 * not validate the hardware with intermediate values.
 *-----------------------------------------------------------------------------
 */
int gfx_vga_mode_switch(int active)
{
    unsigned short crtcindex, crtcdata;
    crtcindex = (INB(0x3CC) & 0x01) ? 0x3D4 : 0x3B4;
    crtcdata = crtcindex + 1;   

    /* UNLOCK EXTENDED CRTC REGISTERS */

    OUTB(crtcindex, CRTC_EXTENDED_REGISTER_LOCK);
    OUTB(crtcdata, 0x57);
    OUTB(crtcdata, 0x4C);

    /* SIGNAL THE BEGINNING OR END OF THE MODE SWITCH 
    /* SoftVGA will hold off validating the back end hardware. */

    OUTB(crtcindex, CRTC_MODE_SWITCH_CONTROL);
    active = active ? 1 : 0;
    OUTB(crtcdata, (unsigned char) active);

    /* WAIT UNTIL SOFTVGA HAS VALIDATED MODE IF ENDING MODE SWITCH */
    /* This is for VSA1 only, where SoftVGA waits until the next */
    /* vertical blank to validate the hardware state. */

    if ((!active) && (!(gu1_detect_vsa2())))
    {
        OUTB(crtcindex, 0x33); 
        while(INB(crtcdata) & 0x80); 
    }

    /* LOCK EXTENDED CRTC REGISTERS */

    OUTB(crtcindex, CRTC_EXTENDED_REGISTER_LOCK);
    OUTB(crtcdata, 0x00);
    return(0);
}

/*-----------------------------------------------------------------------------
 * gu1_detect_vsa2
 *
 * This routine detects if VSA2 is present.  The interface to SoftVGA 
 * changed slightly.
 *-----------------------------------------------------------------------------
 */
int gu1_detect_vsa2(void)
{
    unsigned short crtcindex, crtcdata;
    crtcindex = (INB(0x3CC) & 0x01) ? 0x3D4 : 0x3B4;
    crtcdata = crtcindex + 1;   
    OUTB(crtcindex, 0x35);
    if (INB(crtcdata) != 'C') return(0);
    OUTB(crtcindex, 0x36);
    if (INB(crtcdata) != 'X') return(0);
    return(1);
}

/* END OF FILE */

⌨️ 快捷键说明

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