From 613f808ffbf5ef57fd835504730e87cb06381585 Mon Sep 17 00:00:00 2001 From: Sorgelig Date: Sat, 30 Dec 2023 02:39:55 +0800 Subject: [PATCH] video: fix SPD infoframe. --- video.cpp | 90 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 31 deletions(-) diff --git a/video.cpp b/video.cpp index 8165adf..6284e3e 100644 --- a/video.cpp +++ b/video.cpp @@ -1522,7 +1522,7 @@ static void hdmi_config_init() hdmi_config_set_csc(); } -static void hdmi_config_dv() +static void spd_config(uint8_t *data) { int fd = i2c_open(0x38, 0); if (fd >= 0) @@ -1533,43 +1533,18 @@ static void hdmi_config_dv() res = i2c_smbus_write_byte_data(fd, 0x1F, 0x80); if (res < 0) { - printf("i2c: dv: Couldn't update SPD change register (0x1F, 0x80) %d\n", res); + printf("i2c: Couldn't update SPD change register (0x1F, 0x80) %d\n", res); } else { - VideoInfo *vi = ¤t_video_info; - - uint8_t data[32] = { - 0x83, 0x01, 25, - 'D', 'V', '1' /* version */, - (uint8_t)((vi->interlaced ? 1 : 0) | (vi->rotated ? 2 : 0) | (menu_present() ? 4 : 0)), - (uint8_t)(vi->pixrep ? vi->pixrep : (vi->ctime / vi->width)), - (uint8_t)vi->de_h, - (uint8_t)(vi->de_h >> 8), - (uint8_t)vi->de_v, - (uint8_t)(vi->de_v >> 8), - (uint8_t)vi->width, - (uint8_t)(vi->width >> 8), - (uint8_t)vi->height, - (uint8_t)(vi->height >> 8) - }; - - char *name = user_io_get_core_name(); - for (int i = 16; i < 32; i++) - { - if (!*name) break; - data[i] = (uint8_t)(*name); - name++; - } - for (int i = 0; i < 31; i++) { res = i2c_smbus_write_byte_data(fd, i, data[i]); - if (res < 0) printf("i2c: dv: SPD register write error (%02X %02x): %d\n", i, data[i], res); + if (res < 0) printf("i2c: SPD register write error (%02X %02x): %d\n", i, data[i], res); } res = i2c_smbus_write_byte_data(fd, 0x1F, 0x00); - if (res < 0) printf("i2c: dv: Couldn't update SPD change register (0x1F, 0x00), %d\n", res); + if (res < 0) printf("i2c: Couldn't update SPD change register (0x1F, 0x00), %d\n", res); } i2c_close(fd); } @@ -1579,6 +1554,58 @@ static void hdmi_config_dv() } } +static void spd_config_dv() +{ + VideoInfo *vi = ¤t_video_info; + + uint8_t data[32] = { + 0x83, 0x01, 25, 0, + 'D', 'V', '1' /* version */, + (uint8_t)((vi->interlaced ? 1 : 0) | (vi->rotated ? 2 : 0) | (menu_present() ? 4 : 0)), + (uint8_t)(vi->pixrep ? vi->pixrep : (vi->ctime / vi->width)), + (uint8_t)vi->de_h, + (uint8_t)(vi->de_h >> 8), + (uint8_t)vi->de_v, + (uint8_t)(vi->de_v >> 8), + (uint8_t)vi->width, + (uint8_t)(vi->width >> 8), + (uint8_t)vi->height, + (uint8_t)(vi->height >> 8) + }; + + char *name = user_io_get_core_name(); + for (int i = 17; i < 32; i++) + { + if (!*name) break; + data[i] = (uint8_t)(*name); + name++; + } + + spd_config(data); +} + +/* +static void spd_config_hdmi() +{ + uint8_t data[32] = { + 0x83, 0x01, 25, 0, + 'M', 'i', 'S', 'T', 'e', 'r', 0, 0, + }; + + char *name = user_io_get_core_name(); + for (int i = 12; i < 27; i++) + { + if (!*name) break; + data[i] = (uint8_t)(*name); + name++; + } + + data[27] = 8; // GAME + + spd_config(data); +} +*/ + static void hdmi_config_set_hdr() { // Grab desired nits values @@ -2857,7 +2884,8 @@ void video_mode_adjust() current_video_info = video_info; show_video_info(&video_info, &v_cur); set_yc_mode(); - if (cfg.direct_video) hdmi_config_dv(); + if (cfg.direct_video) spd_config_dv(); + //else if(use_vrr != VRR_FREESYNC) spd_config_hdmi(); } force = false; @@ -2865,7 +2893,7 @@ void video_mode_adjust() { static int menu = 0; int menu_now = menu_present(); - if(menu != menu_now) hdmi_config_dv(); + if(menu != menu_now) spd_config_dv(); menu = menu_now; }