mirror of
https://github.com/marqs85/ossc
synced 2026-10-30 11:47:26 +03:00
calculate hsync width on FPGA instead of reading TVP7002
This commit is contained in:
1 parent
de1b441167
commit
ab6bd9fc8a
8 files changed
+31
-11
No files matched your search
@@ -47,6 +47,7 @@
|
||||
#define STATUS_TIMEOUT_US 25000
|
||||
|
||||
#define PCNT_TOLERANCE 50
|
||||
#define HSYNC_WIDTH_TOLERANCE 8
|
||||
|
||||
alt_u32 sys_ctrl;
|
||||
|
||||
@@ -309,7 +310,7 @@ void set_sampler_phase(uint8_t sampler_phase) {
|
||||
status_t get_status(tvp_sync_input_t syncinput)
|
||||
{
|
||||
alt_u32 totlines, clkcnt, pcnt_frame;
|
||||
alt_u8 progressive, sync_active, valid_linecnt;
|
||||
alt_u8 progressive, sync_active, valid_linecnt, hsync_width;
|
||||
status_t status = NO_CHANGE;
|
||||
alt_timestamp_type start_ts = alt_timestamp();
|
||||
|
||||
@@ -326,6 +327,7 @@ status_t get_status(tvp_sync_input_t syncinput)
|
||||
totlines = sc->fe_status.vtotal;
|
||||
progressive = !sc->fe_status.interlace_flag;
|
||||
pcnt_frame = (unsigned long)sc->fe_status2.pcnt_frame;
|
||||
hsync_width = (unsigned long)sc->fe_status2.hsync_width;
|
||||
clkcnt = pcnt_frame/(totlines>>!progressive);
|
||||
|
||||
valid_linecnt = check_linecnt(progressive, totlines);
|
||||
@@ -343,8 +345,10 @@ status_t get_status(tvp_sync_input_t syncinput)
|
||||
if ((totlines != cm.totlines) ||
|
||||
(progressive != cm.progressive) ||
|
||||
(pcnt_frame < (cm.pcnt_frame - PCNT_TOLERANCE)) ||
|
||||
(pcnt_frame > (cm.pcnt_frame + PCNT_TOLERANCE))) {
|
||||
printf("totlines: %lu (cur) / %lu (prev), pcnt_frame: %lu (cur) / %lu (prev)\n", totlines, cm.totlines, pcnt_frame, cm.pcnt_frame);
|
||||
(pcnt_frame > (cm.pcnt_frame + PCNT_TOLERANCE)) ||
|
||||
(hsync_width < (cm.hsync_width - HSYNC_WIDTH_TOLERANCE)) ||
|
||||
(hsync_width > (cm.hsync_width + HSYNC_WIDTH_TOLERANCE))) {
|
||||
printf("totlines: %lu (cur) / %lu (prev), pcnt_frame: %lu (cur) / %lu (prev), hsync_width: %lu (cur) / %lu (prev)\n", totlines, cm.totlines, pcnt_frame, cm.pcnt_frame, hsync_width, cm.hsync_width);
|
||||
|
||||
status = (status < MODE_CHANGE) ? MODE_CHANGE : status;
|
||||
}
|
||||
@@ -358,6 +362,7 @@ status_t get_status(tvp_sync_input_t syncinput)
|
||||
cm.totlines = totlines;
|
||||
cm.clkcnt = clkcnt;
|
||||
cm.pcnt_frame = pcnt_frame;
|
||||
cm.hsync_width = hsync_width;
|
||||
cm.progressive = progressive;
|
||||
}
|
||||
|
||||
@@ -556,10 +561,13 @@ void program_mode()
|
||||
printf("\nLines: %u %c\n", (unsigned)cm.totlines, cm.progressive ? 'p' : 'i');
|
||||
printf("Clocks per line: %u\n", (unsigned)cm.clkcnt);
|
||||
|
||||
h_syncinlen = tvp_readreg(TVP_HSINWIDTH);
|
||||
//h_syncinlen = tvp_readreg(TVP_HSINWIDTH);
|
||||
h_syncinlen = cm.hsync_width;
|
||||
#ifdef DEBUG
|
||||
v_syncinlen = tvp_readreg(TVP_VSINWIDTH);
|
||||
macrovis = !!(tvp_readreg(TVP_LINECNT2) & (1<<6));
|
||||
printf("Hswidth: %u Vswidth: %u Macrovision: %u\n", (unsigned)h_syncinlen, (unsigned)(v_syncinlen & 0x1F), (unsigned)macrovis);
|
||||
#endif
|
||||
|
||||
vmode_in.timings.h_synclen = h_syncinlen;
|
||||
vmode_in.timings.v_total = cm.totlines;
|
||||
|
||||
@@ -77,6 +77,7 @@ typedef struct {
|
||||
typedef struct {
|
||||
alt_u32 totlines;
|
||||
alt_u32 pcnt_frame;
|
||||
alt_u32 hsync_width;
|
||||
alt_u32 clkcnt;
|
||||
alt_u8 progressive;
|
||||
alt_8 id;
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#include "sysconfig.h"
|
||||
|
||||
#define FW_VER_MAJOR 1
|
||||
#define FW_VER_MINOR 02
|
||||
#define FW_VER_MINOR 03
|
||||
|
||||
#define PROFILE_VER_MAJOR 1
|
||||
#define PROFILE_VER_MINOR 02
|
||||
|
||||
@@ -179,7 +179,7 @@ int read_userdata(alt_u8 entry, int dry_run)
|
||||
switch (((ude_hdr*)databuf)->type) {
|
||||
case UDE_INITCFG:
|
||||
if ((((ude_hdr*)databuf)->version_major != INITCFG_VER_MAJOR) || (((ude_hdr*)databuf)->version_minor != INITCFG_VER_MINOR)) {
|
||||
printf("Initconfig version %u.%u does not match current one\n", ((ude_hdr*)databuf)->version_major, ((ude_hdr*)databuf)->version_minor);
|
||||
printf("Initconfig version %u.%.2u does not match current one\n", ((ude_hdr*)databuf)->version_major, ((ude_hdr*)databuf)->version_minor);
|
||||
return 2;
|
||||
}
|
||||
if (((ude_initcfg*)databuf)->data_len == sizeof(ude_initcfg) - offsetof(ude_initcfg, last_profile)) {
|
||||
@@ -210,7 +210,7 @@ int read_userdata(alt_u8 entry, int dry_run)
|
||||
break;
|
||||
case UDE_PROFILE:
|
||||
if ((((ude_hdr*)databuf)->version_major != PROFILE_VER_MAJOR) || (((ude_hdr*)databuf)->version_minor != PROFILE_VER_MINOR)) {
|
||||
printf("Profile version %u.%u does not match current one\n", ((ude_hdr*)databuf)->version_major, ((ude_hdr*)databuf)->version_minor);
|
||||
printf("Profile version %u.%.2u does not match current one\n", ((ude_hdr*)databuf)->version_major, ((ude_hdr*)databuf)->version_minor);
|
||||
return 2;
|
||||
}
|
||||
if ((((ude_profile*)databuf)->avc_data_len == sizeof(avconfig_t)) && (((ude_profile*)databuf)->vm_data_len == sizeof(video_modes_plm_default))) {
|
||||
@@ -310,10 +310,10 @@ int import_userdata()
|
||||
}
|
||||
|
||||
if ((header.type == UDE_PROFILE) && ((header.version_major != PROFILE_VER_MAJOR) || (header.version_minor != PROFILE_VER_MINOR))) {
|
||||
printf("Profile version %u.%u does not match current one\n", header.version_major, header.version_minor);
|
||||
printf("Profile version %u.%.2u does not match current one\n", header.version_major, header.version_minor);
|
||||
continue;
|
||||
} else if ((header.type == UDE_INITCFG) && ((header.version_major != INITCFG_VER_MAJOR) || (header.version_minor != INITCFG_VER_MINOR))) {
|
||||
printf("Initconfig version %u.%u does not match current one\n", header.version_major, header.version_minor);
|
||||
printf("Initconfig version %u.%.2u does not match current one\n", header.version_major, header.version_minor);
|
||||
continue;
|
||||
} else if (header.type > UDE_PROFILE) {
|
||||
printf("Unknown userdata entry type %u\n", header.type);
|
||||
|
||||
@@ -91,6 +91,8 @@ static void tvp_set_clamp_alc(video_type type, alt_u8 clamp_ref_offset, alt_8 cl
|
||||
else if (clamp_pos + clamp_width + alc_offset > 255)
|
||||
clamp_pos = 255 - alc_offset - clamp_width;
|
||||
|
||||
printf("Clamp pos: %u, width: %u (ref_offset: %u, user_offset %d)\n", clamp_pos, clamp_width, clamp_ref_offset, clamp_user_offset);
|
||||
|
||||
tvp_writereg(TVP_CLAMPSTART, (alt_u8)clamp_pos);
|
||||
tvp_writereg(TVP_CLAMPWIDTH, clamp_width);
|
||||
|
||||
|
||||
Reference in new issue
Block a user