mirror of
https://github.com/marqs85/ossc.git
synced 2026-04-21 05:16:31 +00:00
fix lockup issue due to counter reaching max value
This commit is contained in:
@@ -3324,21 +3324,9 @@ SetAVIInfoFrame(AVI_InfoFrame *pAVIInfoFrame)
|
||||
}
|
||||
|
||||
Switch_HDMITX_Bank(1) ;
|
||||
HDMITX_WriteI2C_Byte(REG_TX_AVIINFO_DB1,pAVIInfoFrame->pktbyte.AVI_DB[0]);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_AVIINFO_DB2,pAVIInfoFrame->pktbyte.AVI_DB[1]);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_AVIINFO_DB3,pAVIInfoFrame->pktbyte.AVI_DB[2]);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_AVIINFO_DB4,pAVIInfoFrame->pktbyte.AVI_DB[3]);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_AVIINFO_DB5,pAVIInfoFrame->pktbyte.AVI_DB[4]);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_AVIINFO_DB6,pAVIInfoFrame->pktbyte.AVI_DB[5]);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_AVIINFO_DB7,pAVIInfoFrame->pktbyte.AVI_DB[6]);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_AVIINFO_DB8,pAVIInfoFrame->pktbyte.AVI_DB[7]);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_AVIINFO_DB9,pAVIInfoFrame->pktbyte.AVI_DB[8]);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_AVIINFO_DB10,pAVIInfoFrame->pktbyte.AVI_DB[9]);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_AVIINFO_DB11,pAVIInfoFrame->pktbyte.AVI_DB[10]);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_AVIINFO_DB12,pAVIInfoFrame->pktbyte.AVI_DB[11]);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_AVIINFO_DB13,pAVIInfoFrame->pktbyte.AVI_DB[12]);
|
||||
for(i = 0,ucData = 0; i < 13 ; i++)
|
||||
for(i = 0,ucData = 0; i < AVI_INFOFRAME_LEN ; i++)
|
||||
{
|
||||
HDMITX_WriteI2C_Byte(REG_TX_AVIINFO_DB1+i,pAVIInfoFrame->pktbyte.AVI_DB[i]);
|
||||
ucData -= pAVIInfoFrame->pktbyte.AVI_DB[i] ;
|
||||
}
|
||||
ErrorF("SetAVIInfo(): ") ;
|
||||
@@ -3386,13 +3374,9 @@ SetAudioInfoFrame(Audio_InfoFrame *pAudioInfoFrame)
|
||||
}
|
||||
|
||||
Switch_HDMITX_Bank(1) ;
|
||||
HDMITX_WriteI2C_Byte(REG_TX_PKT_AUDINFO_CC,pAudioInfoFrame->pktbyte.AUD_DB[0]);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_PKT_AUDINFO_SF,pAudioInfoFrame->pktbyte.AUD_DB[1]);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_PKT_AUDINFO_CA,pAudioInfoFrame->pktbyte.AUD_DB[3]);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_PKT_AUDINFO_DM_LSV,pAudioInfoFrame->pktbyte.AUD_DB[4]) ;
|
||||
|
||||
for(i = 0,ucData = 0 ; i< 5 ; i++)
|
||||
{
|
||||
HDMITX_WriteI2C_Byte(REG_TX_PKT_AUDINFO_CC+i,pAudioInfoFrame->pktbyte.AUD_DB[i]);
|
||||
ucData -= pAudioInfoFrame->pktbyte.AUD_DB[i] ;
|
||||
}
|
||||
ucData -= 0x80+AUDIO_INFOFRAME_VER+AUDIO_INFOFRAME_TYPE+AUDIO_INFOFRAME_LEN ;
|
||||
@@ -3422,11 +3406,9 @@ SetHDRInfoFrame(HDR_InfoFrame *pHDRInfoFrame)
|
||||
HDMITX_WriteI2C_Byte(REG_TX_PKT_HB01, pHDRInfoFrame->info.Ver);
|
||||
HDMITX_WriteI2C_Byte(REG_TX_PKT_HB02, pHDRInfoFrame->info.Len);
|
||||
|
||||
for(i = 0; i < HDR_INFOFRAME_LEN ; i++)
|
||||
HDMITX_WriteI2C_Byte(REG_TX_PKT_PB01+i, pHDRInfoFrame->pktbyte.HDR_DB[i]);
|
||||
|
||||
for(i = 0,ucData = 0 ; i< HDR_INFOFRAME_LEN ; i++)
|
||||
{
|
||||
HDMITX_WriteI2C_Byte(REG_TX_PKT_PB01+i, pHDRInfoFrame->pktbyte.HDR_DB[i]);
|
||||
ucData -= pHDRInfoFrame->pktbyte.HDR_DB[i] ;
|
||||
}
|
||||
ucData -= 0x80+HDR_INFOFRAME_VER+HDR_INFOFRAME_TYPE+HDR_INFOFRAME_LEN ;
|
||||
@@ -3458,7 +3440,7 @@ SetSPDInfoFrame(SPD_InfoFrame *pSPDInfoFrame)
|
||||
}
|
||||
|
||||
Switch_HDMITX_Bank(1) ;
|
||||
for(i = 0,ucData = 0 ; i < 25 ; i++)
|
||||
for(i = 0,ucData = 0 ; i < SPD_INFOFRAME_LEN ; i++)
|
||||
{
|
||||
ucData -= pSPDInfoFrame->pktbyte.SPD_DB[i] ;
|
||||
HDMITX_WriteI2C_Byte(REG_TX_PKT_SPDINFO_PB1+i,pSPDInfoFrame->pktbyte.SPD_DB[i]) ;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -45,6 +45,7 @@
|
||||
#define MIN_LINES_PROGRESSIVE 200
|
||||
#define MIN_LINES_INTERLACED 400
|
||||
#define STATUS_TIMEOUT_US 25000
|
||||
#define MAINLOOP_INTERVAL_US 10000
|
||||
|
||||
#define PCNT_TOLERANCE 50
|
||||
#define HSYNC_WIDTH_TOLERANCE 8
|
||||
@@ -910,7 +911,8 @@ int main()
|
||||
|
||||
alt_u32 input_vec;
|
||||
|
||||
alt_u32 auto_input_timestamp = 300 * (alt_timestamp_freq() >> 10);
|
||||
alt_timestamp_type start_ts;
|
||||
alt_timestamp_type auto_input_timestamp = 0;
|
||||
alt_u8 auto_input_changed = 0;
|
||||
alt_u8 auto_input_ctr = 0;
|
||||
alt_u8 auto_input_current_ctr = AUTO_CURRENT_MAX_COUNT;
|
||||
@@ -918,6 +920,9 @@ int main()
|
||||
|
||||
int init_stat, man_input_change;
|
||||
|
||||
// Start system timer
|
||||
alt_timestamp_start();
|
||||
|
||||
init_stat = init_hw();
|
||||
|
||||
if (init_stat >= 0) {
|
||||
@@ -937,11 +942,10 @@ int main()
|
||||
while (1) {}
|
||||
}
|
||||
|
||||
// start timer for auto input
|
||||
alt_timestamp_start();
|
||||
|
||||
// Mainloop
|
||||
while(1) {
|
||||
start_ts = alt_timestamp();
|
||||
|
||||
// Read remote control and PCB button status
|
||||
input_vec = IORD_ALTERA_AVALON_PIO_DATA(PIO_1_BASE);
|
||||
remote_code = input_vec & RC_MASK;
|
||||
@@ -961,8 +965,8 @@ int main()
|
||||
}
|
||||
|
||||
// Auto input switching
|
||||
if (auto_input != AUTO_OFF && cm.avinput != AV_TESTPAT && !cm.sync_active && !menu_active
|
||||
&& alt_timestamp() >= auto_input_timestamp && auto_input_ctr < AUTO_MAX_COUNT) {
|
||||
if ((auto_input != AUTO_OFF) && (cm.avinput != AV_TESTPAT) && !cm.sync_active && !menu_active
|
||||
&& (alt_timestamp() >= auto_input_timestamp + 300 * (alt_timestamp_freq() >> 10)) && (auto_input_ctr < AUTO_MAX_COUNT)) {
|
||||
|
||||
// Keep switching on the same physical input when set to Current input or a short time after losing sync.
|
||||
auto_input_keep_current = (auto_input == AUTO_CURRENT_INPUT || auto_input_current_ctr < AUTO_CURRENT_MAX_COUNT);
|
||||
@@ -1001,8 +1005,8 @@ int main()
|
||||
// For input linked profile loading below
|
||||
auto_input_changed = 1;
|
||||
|
||||
// reset timer
|
||||
alt_timestamp_start();
|
||||
// set auto_input_timestamp
|
||||
auto_input_timestamp = alt_timestamp();
|
||||
}
|
||||
|
||||
man_input_change = parse_control();
|
||||
@@ -1103,9 +1107,9 @@ int main()
|
||||
// record last input if it was selected manually
|
||||
if (def_input == AV_LAST)
|
||||
write_userdata(INIT_CONFIG_SLOT);
|
||||
// Reset auto input timer when input is manually changed
|
||||
// Set auto_input_timestamp when input is manually changed
|
||||
auto_input_ctr = 0;
|
||||
alt_timestamp_start();
|
||||
auto_input_timestamp = alt_timestamp();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1165,7 +1169,8 @@ int main()
|
||||
strncpy(row1, avinput_str[cm.avinput], LCD_ROW_LEN+1);
|
||||
strncpy(row2, " NO SYNC", LCD_ROW_LEN+1);
|
||||
ui_disp_status(1);
|
||||
alt_timestamp_start();// reset auto input timer
|
||||
// Set auto_input_timestamp
|
||||
auto_input_timestamp = alt_timestamp();
|
||||
auto_input_ctr = 0;
|
||||
auto_input_current_ctr = 0;
|
||||
}
|
||||
@@ -1187,7 +1192,17 @@ int main()
|
||||
}
|
||||
}
|
||||
|
||||
usleep(300); // Avoid executing mainloop multiple times per vsync
|
||||
while (alt_timestamp() < start_ts + MAINLOOP_INTERVAL_US*(TIMER_0_FREQ/1000000)) {}
|
||||
|
||||
// restart timer if past half-range
|
||||
if (start_ts > 0x7fffffff) {
|
||||
alt_timestamp_start();
|
||||
if (auto_input_timestamp > start_ts)
|
||||
auto_input_timestamp -= start_ts;
|
||||
else
|
||||
auto_input_timestamp = 0;
|
||||
//printf("Timer restart\n");
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#include "sysconfig.h"
|
||||
|
||||
#define FW_VER_MAJOR 1
|
||||
#define FW_VER_MINOR 05
|
||||
#define FW_VER_MINOR 06
|
||||
|
||||
#define PROFILE_VER_MAJOR 1
|
||||
#define PROFILE_VER_MINOR 05
|
||||
|
||||
Reference in New Issue
Block a user