📄 cim_vop.c
字号:
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 + -