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

📄 cim_vop.c

📁 LX 800 WindowsCE 6.0 BSP
💻 C
📖 第 1 页 / 共 2 页
字号:
	
	return CIM_STATUS_OK;
}

/*---------------------------------------------------------------------------
 * vop_restore_state
 *
 * This routine restores the state of the vop registers - which were
 * previously saved using vop_save_state.
 *---------------------------------------------------------------------------*/

int vop_restore_state (VOPSTATEBUFFER *restore_buffer)
{
	if (!restore_buffer)
        return CIM_STATUS_INVALIDPARAMS;

	WRITE_VOP32(VOP_CONFIGURATION, restore_buffer->config);
	
	return CIM_STATUS_OK;
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 * CIMARRON VOP READ ROUTINES
 * These routines are included for use in diagnostics or when debugging.  They
 * can be optionally excluded from a project.
 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

#if CIMARRON_INCLUDE_VOP_READ_ROUTINES

/*---------------------------------------------------------------------------
 * vop_get_current_mode
 *
 * This routine reads the current VIP operating mode and stores it in the
 * passed VOP_CONFIGURATION structure.
 *---------------------------------------------------------------------------*/

int vop_get_current_mode (VOPCONFIGURATIONBUFFER *config)
{
    unsigned long vop_config = 0;
    unsigned long alpha;
		
    if (!config)
        return CIM_STATUS_INVALIDPARAMS;

    vop_config = READ_VOP32 (VOP_CONFIGURATION);
    alpha = READ_VID32 (DF_VID_ALPHA_CONTROL);

    /* READ THE CURRENT MODE */

    switch (vop_config & VOP_CONFIG_MODE_MASK)
    {
        case VOP_CONFIG_DISABLED: config->mode = VOP_MODE_DISABLED; break;
        case VOP_CONFIG_VIP1_1:   config->mode = VOP_MODE_VIP11;    break;
        case VOP_CONFIG_CCIR656:  config->mode = VOP_MODE_CCIR656;  break;
        case VOP_CONFIG_VIP2_0:

            if (vop_config & VOP_CONFIG_ENABLE_601)
                config->mode = VOP_MODE_601;
            else if (vop_config & VOP_CONFIG_VIP2_16BIT)
                config->mode = VOP_MODE_VIP20_16BIT;
            else
                config->mode = VOP_MODE_VIP20_8BIT;
            break;
    }

    /* READ 601 SETTINGS */

    config->vop601.flags = vop_config & (VOP_CONFIG_INVERT_DISPE |
        VOP_CONFIG_INVERT_HSYNC | VOP_CONFIG_INVERT_VSYNC);

    config->vop601.vsync_shift = vop_config & VOP_CONFIG_VSYNC_MASK;
    config->vop601.vsync_shift_count = READ_REG32 (DC3_VID_DS_DELTA) & DC3_601_VSYNC_SHIFT_MASK;

    if ((alpha & DF_CSC_GRAPHICS_RGB_TO_YUV) ||
        (alpha & DF_CSC_VOP_RGB_TO_YUV))
    {
        /* YUV OUTPUT */

        if (vop_config & VOP_CONFIG_DISABLE_DECIMATE)
            config->vop601.output_mode = VOP_601_YUV_4_4_4;
        else if (vop_config & VOP_CONFIG_VIP2_16BIT)
            config->vop601.output_mode = VOP_601_YUV_16BIT;
        else
            config->vop601.output_mode = VOP_601_YUV_8BIT;
    }
    else
    {
        config->vop601.output_mode = VOP_601_RGB_8_8_8;
    }

    config->flags = 0;

    /* READ THE UNIVERSAL VOP OPTIONS */

    if (vop_config & VOP_CONFIG_SWAPUV)         config->flags |= VOP_FLAG_SWAP_UV;
    if (vop_config & VOP_CONFIG_SWAPVBI)        config->flags |= VOP_FLAG_SWAP_VBI;
    if (vop_config & VOP_CONFIG_VBI)            config->flags |= VOP_FLAG_VBI;
    if (vop_config & VOP_CONFIG_TASK)           config->flags |= VOP_FLAG_TASK;
    if (vop_config & VOP_CONFIG_SC_COMPATIBLE)  config->flags |= VOP_FLAG_SINGLECHIPCOMPAT;
    if (vop_config & VOP_CONFIG_EXTENDED_SAV)   config->flags |= VOP_FLAG_EXTENDEDSAV;

    config->conversion_mode = vop_config & VOP_CONFIG_422_MASK;

    config->vsync_out = READ_VIP32 (VIP_CONTROL2) & VIP_CONTROL2_SYNC2PIN_MASK;
		
	return CIM_STATUS_OK;
}

/*---------------------------------------------------------------------------
 * vop_get_vbi_window
 *
 * This routine reads the current VBI configuration for VOP output.
 *---------------------------------------------------------------------------*/

int vop_get_vbi_configuration (VOPVBIWINDOWBUFFER *buffer)
{
    unsigned long temp;
    unsigned long hstart, hstop;
    unsigned long htotal, hsyncstart;

    if (!buffer)
        return CIM_STATUS_INVALIDPARAMS;	

    htotal     = ((READ_REG32 (DC3_H_ACTIVE_TIMING) >> 16) & 0xFFF) + 1;
    hsyncstart =  (READ_REG32 (DC3_H_SYNC_TIMING) & 0xFFF) + 1;

    /* DECODE HORIZONTAL POSITION */
    /* This is done according to the requested horizontal origin */

    temp = READ_REG32 (DC3_VBI_HOR);
    hstart =  (temp & DC3_VBI_HOR_START_MASK) + 1;
    hstop  = ((temp & DC3_VBI_HOR_END_MASK) >> DC3_VBI_HOR_END_SHIFT) + 1;
    if (buffer->horz_from_hsync)
    {
        buffer->horz_start = hstart + htotal - hsyncstart;
        if (buffer->horz_start >= (long)htotal)
            buffer->horz_start -= htotal;
    }
    else
    {
        if (hstart > hsyncstart)
            buffer->horz_start = (long)hstart - (long)htotal;
        else
            buffer->horz_start = hstart;
    }

    if (hstop > hstart)
        buffer->vbi_width = hstop - hstart;
    else
        buffer->vbi_width = (htotal - hstart) + hstop;

    /* READ LINE MASKS */

	temp = READ_REG32 (DC3_VBI_LN_ODD);
    buffer->odd_line_offset = (temp & DC3_VBI_ODD_LINE_MASK) >> DC3_VBI_ODD_LINE_SHIFT;
    buffer->odd_line_capture_mask = (temp & DC3_VBI_ODD_ENABLE_MASK);

    temp = READ_REG32 (DC3_VBI_LN_EVEN);
    buffer->even_line_offset = (temp & DC3_VBI_EVEN_LINE_MASK) >> DC3_VBI_EVEN_LINE_SHIFT;
    buffer->even_line_capture_mask = (temp & DC3_VBI_EVEN_ENABLE_MASK);

    /* READ VBI UPSCALE SETTINGS */	

    buffer->enable_upscale = 0;
	temp  = READ_REG32 (DC3_VBI_EVEN_CTL);
    if (temp & DC3_VBI_EVEN_CTL_UPSCALE)
        buffer->enable_upscale = 1;

    /* READ SOURCE OFFSETS */

    buffer->even_address_offset = temp & DC3_VBI_EVEN_CTL_OFFSET_MASK;
	buffer->odd_address_offset  = READ_REG32 (DC3_VBI_ODD_CTL) & DC3_VBI_ODD_CTL_OFFSET_MASK;
	
    /* PITCH AND SIZE */

    temp = READ_REG32 (DC3_VBI_PITCH);
    buffer->data_size  = (temp >> 16) << 3;
    buffer->data_pitch = (temp & 0xFFFF);

	return CIM_STATUS_OK;
}

/*---------------------------------------------------------------------------
 * vop_get_vbi_enable
 *
 * This routine reads the current enable status of VBI output.
 *---------------------------------------------------------------------------*/

int vop_get_vbi_enable (void)
{
    if (READ_REG32 (DC3_VBI_EVEN_CTL) & DC3_VBI_ENABLE)
        return 1;

    return 0;
}

/*---------------------------------------------------------------------------
 * vop_get_crc
 *
 * This routine returns a CRC of the current VOP data
 ---------------------------------------------------------------------------*/

unsigned long vop_get_crc(void)
{
	unsigned long crc;
	unsigned long config = READ_VOP32(VOP_CONFIGURATION);
    unsigned long timeout = 1000;

	if (!(READ_REG32 (DC3_DISPLAY_CFG) & DC3_DCFG_TGEN))
		return 0xFFFFFFFF;

	/* RESET CRC */

	WRITE_VOP32 (VOP_CONFIGURATION, config & ~VOP_CONFIG_ENABLE_SIGNATURE);

    /* WAIT FOR THE RESET TO BE LATCHED */

    while ((READ_VOP32 (VOP_SIGNATURE) != 0x00000001) && timeout)
        timeout--;

    WRITE_VOP32 (VOP_CONFIGURATION, config |  VOP_CONFIG_ENABLE_SIGNATURE);

	/* WAIT UNTIL NOT ACTIVE, THEN ACTIVE, NOT ACTIVE, THEN ACTIVE */
	
    while (!(READ_VOP32 (VOP_CONFIGURATION) & VOP_CONFIG_SIGVAL))
        ;
	
	crc = READ_VOP32 (VOP_SIGNATURE);
	
	return crc;
}

/*---------------------------------------------------------------------------
 * vop_read_vbi_crc
 *
 * This routine returns a CRC of the current VBI data
 ---------------------------------------------------------------------------*/

unsigned long vop_read_vbi_crc(void)
{
    unsigned long gcfg, unlock, vbi_even;
	unsigned long crc;

	if (!(READ_REG32 (DC3_DISPLAY_CFG) & DC3_DCFG_TGEN) ||
        !(READ_REG32 (DC3_VBI_EVEN_CTL) & DC3_VBI_ENABLE))
    {
		return 0xFFFFFFFF;
    }	

	unlock   = READ_REG32 (DC3_UNLOCK);
	gcfg     = READ_REG32 (DC3_GENERAL_CFG);
    vbi_even = READ_REG32 (DC3_VBI_EVEN_CTL);

	gcfg |=   DC3_GCFG_SGRE | DC3_GCFG_CRC_MODE;
	gcfg &= ~(DC3_GCFG_SGFR | DC3_GCFG_SIG_SEL);
    vbi_even |= DC3_VBI_EVEN_ENABLE_CRC;

	WRITE_REG32 (DC3_UNLOCK, DC3_UNLOCK_VALUE);
    WRITE_REG32 (DC3_VBI_EVEN_CTL, vbi_even);
	WRITE_REG32 (DC3_GENERAL_CFG, gcfg & ~DC3_GCFG_SIGE);
    WRITE_REG32 (DC3_GENERAL_CFG, gcfg |  DC3_GCFG_SIGE);

	/* WAIT FOR THE CRC TO BE COMPLETED */

	while (!(READ_REG32 (DC3_LINE_CNT_STATUS) & DC3_LNCNT_SIGC))
		;

	/* READ THE COMPLETED CRC */

	crc = READ_REG32 (DC3_PAL_DATA);

	/* RESTORE THE PALETTE SETTINGS */

	gcfg &= ~DC3_GCFG_SGRE;
	WRITE_REG32 (DC3_GENERAL_CFG, gcfg);
	WRITE_REG32 (DC3_UNLOCK, unlock);

	return crc;
}

#endif

⌨️ 快捷键说明

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