修复AMD显卡正常时不能升级问题

This commit is contained in:
chenjiangqun
2026-06-30 20:13:14 +08:00
parent 370ab2ea7c
commit bb0706e7b7

View File

@@ -370,8 +370,11 @@ namespace WinISP
if (string.IsNullOrWhiteSpace(_fwBoardName))
_fwBoardName = DDC_GetMonitorName(MS_GET_BOARD_NAME);
if (string.IsNullOrWhiteSpace(_fwVersionFromDDC))
{
_fwVersionFromDDC = DDC_GetMonitorName(MS_GET_FW_VERSION);
frmISP.WriteLog($"DDC_GetMonitorName:_fwVersionFromDDC{_fwVersionFromDDC}", "debug");
}
// Only model name (0x36) is required; chip/panel/board may not be supported on all DDC paths.
if (!string.IsNullOrWhiteSpace(_fwModelName))
return true;
@@ -405,49 +408,6 @@ namespace WinISP
return normalizedValue;
}
private string GetModelMismatchMessage(string monitorModelName, string binModelName)
{
return "Model not match.";
}
private bool IsModelNameMatch(string u8Model_Name)
{
string monitorValue = NormalizeMonitorModelName(_monitorModelName);
if (String.IsNullOrEmpty(monitorValue))
return true;
return string.Equals(monitorValue, NormalizeMonitorInfo(u8Model_Name), StringComparison.Ordinal);
}
private bool IsChipNameMatch(string u8Chi_pName)
{
string monitorValue = NormalizeMonitorInfo(_monitorChipName);
if (String.IsNullOrEmpty(monitorValue))
return true;
return string.Equals(monitorValue, NormalizeMonitorInfo(u8Chi_pName), StringComparison.Ordinal);
}
private bool IsPanelNameMatch(string u8Panel_Name)
{
string monitorValue = NormalizeMonitorInfo(_monitorPanelName);
if (String.IsNullOrEmpty(monitorValue))
return true;
return string.Equals(monitorValue, NormalizeMonitorInfo(u8Panel_Name), StringComparison.Ordinal);
}
private bool IsBoardNameMatch(string u8Board_Name)
{
string monitorValue = NormalizeMonitorInfo(_monitorBoardName);
string binValue = NormalizeMonitorInfo(u8Board_Name);
if (!String.IsNullOrEmpty(monitorValue))
return string.Equals(monitorValue, binValue, StringComparison.Ordinal);
if (binValue.Length < 4)
return false;
return binValue[0] == 'F' && binValue[1] == 'W' && binValue[2] == '.' && binValue[3] == '0';
}
private void btnLoadFile_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
@@ -582,23 +542,31 @@ namespace WinISP
private string ReadMonitorFieldRobust(byte subCmd, int expectLen, int maxRounds = 30)
{
string best = string.Empty;
int stableCount = 0; // 连续读到相同最长值的次数
for (int round = 0; round < maxRounds; round++)
{
// DDC_GetMonitorName 内部已做 recv[1]==0x80 过滤 + 找 \0 结束符
string v = DDC_GetMonitorName(subCmd, 300);
if (!string.IsNullOrWhiteSpace(v))
{
// 记录最长的结果AMD 可能先读到残片 "MA",后读到完整 "MAG 322URD16"
if (v.Length > best.Length)
{
best = v;
stableCount = 0; // 读到更长的,重置稳定计数
frmISP.WriteLog($"[AMD-Identity] cmd=0x{subCmd:X2} round#{round} got='{v}' (len={v.Length})", "debug");
}
// 完整性判断:读到的长度接近期望值,认为读全了,提前退出
if (v.Length >= expectLen - 2 || v.Length >= 6)
else if (v.Length == best.Length && v == best)
{
stableCount++; // 连续读到相同的完整值
}
// 完整性判断(二选一即退出):
// 1) 读到的长度已接近期望最大长度 → 认为读全
// 2) 同一个完整值连续稳定读到 2 次 → 认为读全(应对实际长度 < expectLen 的字段)
if (best.Length >= expectLen - 1 || stableCount >= 2)
break;
}
WinIOLib.DelayMs(50); // AMD 通道恢复间隔
WinIOLib.DelayMs(50);
}
return best;
}
@@ -749,16 +717,8 @@ namespace WinISP
// Intel IGCL and AMD can complete the FE handshake but still time out on optional
// identity queries during connect. Skip those reads here so connect stays usable.
if (!isIntel && !isAmd) // >>> 改动:用缓存的 isIntel/isAmd 替换原三段强转判断(逻辑等价)
{
QueryConnectedMonitorInfo();
}
else
{
//ClearConnectedMonitorInfo();
QueryConnectedMonitorInfo();
frmISP.WriteLog("Skip optional monitor identity query on AMD/Intel path.", "debug");
}
// 所有显卡都要读,不要忽视
QueryConnectedMonitorInfo();
}
if (IsConnect == false)
@@ -776,15 +736,10 @@ namespace WinISP
case 2: { frmISP.WriteLog("MTKChipType=MST9U", "info"); } break;
}
Application.DoEvents();
if (!isIntel && !isAmd) // >>> 改动:等价替换
{
DDC_GetVersion();
}
else
{
DDC_GetVersion();
frmISP.WriteLog("Skip optional firmware version query on AMD/Intel path.", "debug");
}
// 不忽视,都要读取
DDC_GetVersion();
DDC_SetToolFlag(false);
int pktDelayTime = 0;
@@ -911,13 +866,13 @@ namespace WinISP
private void DDC_SetToolFlag(bool en)
{
// AMD and Intel DDC paths do not support the tool-flag handshake command.
// Sending it causes repeated DDC timeout errors, so skip entirely.
if (IsAmdOrIntelPath())
{
frmISP.WriteLog("DDC_SetToolFlag skipped on AMD/Intel path.", "debug");
return;
}
//// AMD and Intel DDC paths do not support the tool-flag handshake command.
//// Sending it causes repeated DDC timeout errors, so skip entirely.
//if (IsAmdOrIntelPath())
//{
// frmISP.WriteLog("DDC_SetToolFlag skipped on AMD/Intel path.", "debug");
// return;
//}
Byte[] buf = { 0xCC, 0x90, 0x00 };
if (en)
@@ -1537,18 +1492,28 @@ namespace WinISP
private bool ValidateMonitorVsBin(out string errMsg)
{
errMsg = String.Empty;
bool isAmdOrIntel = IsAmdOrIntelPath();
// >>> 优先采用 QueryConnectedMonitorInfo 已读到的真实显示器信息
// AMD/Intel 路径在 Connect 时已通过 ReadMonitorFieldRobust 读取)
if (string.IsNullOrWhiteSpace(_fwModelName) && !string.IsNullOrWhiteSpace(_monitorModelName))
_fwModelName = _monitorModelName;
if (string.IsNullOrWhiteSpace(_fwChipName) && !string.IsNullOrWhiteSpace(_monitorChipName))
_fwChipName = _monitorChipName;
if (string.IsNullOrWhiteSpace(_fwPanelName) && !string.IsNullOrWhiteSpace(_monitorPanelName))
_fwPanelName = _monitorPanelName;
if (string.IsNullOrWhiteSpace(_fwBoardName) && !string.IsNullOrWhiteSpace(_monitorBoardName))
_fwBoardName = _monitorBoardName;
if (string.IsNullOrWhiteSpace(_fwVersionFromDDC))
{
_fwVersionFromDDC = DDC_GetMonitorName(MS_GET_FW_VERSION);
frmISP.WriteLog($"DDC_GetMonitorName:_fwVersionFromDDC{_fwVersionFromDDC}", "debug");
}
if (string.IsNullOrWhiteSpace(_fwModelName))
{
// On AMD/Intel the DDC identity commands are not supported; skip the
// retry loop to avoid flooding the log with timeout errors. The
// legacy-fallback logic below will supply hardcoded identifiers instead.
if (!IsAmdOrIntelPath())
TryReadMonitorIdentity(10, 100);
}
else
{
_fwModelName = NormalizeMonitorModelName(_fwModelName);
{
TryReadMonitorIdentity(10, 100);
}
// -----------------------------------------------------------------------
@@ -1582,6 +1547,7 @@ namespace WinISP
: (usingLegacyFallback ? LegacyChip : string.Empty);
string effPanel = !string.IsNullOrWhiteSpace(_fwPanelName) ? _fwPanelName
: (usingLegacyFallback ? LegacyPanel : string.Empty);
// effVer: prefer actual DDC read; fall back to LegacyFWVer when in legacy-fallback mode
// (covers AMD/Intel path where DDC identity commands are not supported).
string effVer = !string.IsNullOrWhiteSpace(_fwVersionFromDDC) ? _fwVersionFromDDC
@@ -1622,6 +1588,7 @@ namespace WinISP
}
frmISP.WriteLog("ValidateMonitorVsBin: Chip prefix-match accepted: FW=" + effChip + " BIN=" + _u8ChipName, "debug");
}
if (!string.IsNullOrWhiteSpace(effPanel))
{
if (string.IsNullOrWhiteSpace(_u8PanelName))
@@ -1659,6 +1626,7 @@ namespace WinISP
errMsg = "FW Version not match." ;
return false;
}
string normalizedMonVer = NormalizeFwVersionForCompare(effVer);
string normalizedBinVer = NormalizeFwVersionForCompare(_u8FWVersion);
frmISP.WriteLog("ValidateMonitorVsBin: normalizedMonVer=" + normalizedMonVer + " normalizedBinVer=" + normalizedBinVer, "debug");
@@ -1675,6 +1643,7 @@ namespace WinISP
return true;
}
List<FlashSectorInfo> flashSectorInfo = new List<FlashSectorInfo>();
private void btnAuto_Click(object sender, EventArgs e)
{