DO NOT SUBMIT: Use delay lines to find adj_delay setting that fails
Change-Id: If7aa6f2e96cdaf4ac6d6b4fa8564dde6a2ccac79
diff --git a/src/connectivity/wlan/drivers/third_party/broadcom/brcmfmac/sdio/sdio.cc b/src/connectivity/wlan/drivers/third_party/broadcom/brcmfmac/sdio/sdio.cc
index 796206c..ff12846 100644
--- a/src/connectivity/wlan/drivers/third_party/broadcom/brcmfmac/sdio/sdio.cc
+++ b/src/connectivity/wlan/drivers/third_party/broadcom/brcmfmac/sdio/sdio.cc
@@ -2759,7 +2759,34 @@
for (int ndx = 0; ndx < len; ndx++) {
if (ram_cmp[ndx] != expected_data[offset + ndx]) {
BRCMF_ERR("Downloaded RAM image is corrupted at offset %d of %zu (saw:%#x expect:%#x)",
- offset, ram_sz, ram_cmp[ndx], expected_data[offset + ndx]);
+ offset + ndx, ram_sz, ram_cmp[ndx], expected_data[offset + ndx]);
+
+ /*const int start = (ndx & 63) == 0 ? 0 : ((ndx & 63) - 1);*/
+ const int start = (ndx & ~63) == 0 ? 0 : ((ndx & ~63) - 64);
+ const int blocks = start == 0 ? 2 : 3;
+ zxlogf(ERROR, "Read:");
+ for (int i = start; len >= (64 * blocks) && i < (64 * blocks); i += 16) {
+ zxlogf(ERROR,
+ "%04x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x "
+ "%02x %02x",
+ i, ram_cmp[i + 0], ram_cmp[i + 1], ram_cmp[i + 2], ram_cmp[i + 3],
+ ram_cmp[i + 4], ram_cmp[i + 5], ram_cmp[i + 6], ram_cmp[i + 7], ram_cmp[i + 8],
+ ram_cmp[i + 9], ram_cmp[i + 10], ram_cmp[i + 11], ram_cmp[i + 12],
+ ram_cmp[i + 13], ram_cmp[i + 14], ram_cmp[i + 15]);
+ }
+ const char* expected = expected_data + offset;
+ zxlogf(ERROR, "Expected:");
+ for (int i = start; len >= (64 * blocks) && i < (64 * blocks); i += 16) {
+ zxlogf(ERROR,
+ "%04x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x "
+ "%02x %02x",
+ i, expected[i + 0], expected[i + 1], expected[i + 2], expected[i + 3],
+ expected[i + 4], expected[i + 5], expected[i + 6], expected[i + 7],
+ expected[i + 8], expected[i + 9], expected[i + 10], expected[i + 11],
+ expected[i + 12], expected[i + 13], expected[i + 14], expected[i + 15]);
+ }
+
+
break;
}
}
diff --git a/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.cc b/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.cc
index 8338afb..bde93f6 100644
--- a/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.cc
+++ b/src/devices/block/drivers/aml-sdmmc/aml-sdmmc.cc
@@ -1141,55 +1141,35 @@
auto clk = AmlSdmmcClock::Get().ReadFrom(&mmio_);
auto set_adj_delay = [&](uint32_t param) -> void { SetAdjDelay(param); };
- auto set_delay_lines = [&](uint32_t param) -> void { SetDelayLines(param); };
-
- set_delay_lines(0);
-
- TuneWindow phase_windows[AmlSdmmcClock::kMaxClkPhase + 1] = {};
- for (uint32_t phase = 0; phase < std::size(phase_windows); phase++) {
- if (phase != clk.cfg_co_phase()) {
- clk.set_cfg_tx_phase(phase).WriteTo(&mmio_);
- phase_windows[phase] =
- TuneDelayParam(tuning_blk, tuning_cmd_idx, clk.cfg_div() - 1, set_adj_delay);
- }
- }
+ // auto set_delay_lines = [&](uint32_t param) -> void { SetDelayLines(param); };
TuneWindow adj_delay_window;
- uint32_t best_phase = 0;
-
- // Find the largest window of working settings.
- for (uint32_t phase = 0; phase < std::size(phase_windows); phase++) {
- if (phase_windows[phase].size > adj_delay_window.size) {
- adj_delay_window = phase_windows[phase];
- best_phase = phase;
- }
- }
-
- if (adj_delay_window.size == 0) {
- AML_SDMMC_ERROR("No window found for any phase");
+ uint32_t delay_lines = 0;
+ do {
+ SetDelayLines(delay_lines++);
+ adj_delay_window = TuneDelayParam(tuning_blk, tuning_cmd_idx, clk.cfg_div() - 1, set_adj_delay);
+ } while (delay_lines <= max_delay() && adj_delay_window.size == clk.cfg_div());
+ delay_lines--;
+ if (adj_delay_window.size == clk.cfg_div()) {
+ AML_SDMMC_ERROR("Unable to tune, all transfers succeeded");
return ZX_ERR_IO;
}
- const uint32_t best_adj_delay =
- adj_delay_window.size == clk.cfg_div() ? 0 : adj_delay_window.middle() % clk.cfg_div();
+ // Sweep the entire range of settings.
+ // for (uint32_t i = 0; i < clk.cfg_div(); i++) {
+ // set_adj_delay(i);
+ // TuneDelayParam(tuning_blk, tuning_cmd_idx, max_delay(), set_delay_lines);
+ // }
- clk.set_cfg_tx_phase(best_phase).WriteTo(&mmio_);
+ AML_SDMMC_INFO("Delay %u produced failing adj delay value", delay_lines);
+
+ const uint32_t best_adj_delay = adj_delay_window.middle() % clk.cfg_div();
+
+ SetDelayLines(delay_lines);
set_adj_delay(best_adj_delay);
- TuneWindow delay_window =
- TuneDelayParam(tuning_blk, tuning_cmd_idx, max_delay(), set_delay_lines);
-
- if (delay_window.size == 0) {
- AML_SDMMC_ERROR("No delay window found");
- return ZX_ERR_IO;
- }
-
- const uint32_t best_delay = delay_window.middle() % (max_delay() + 1);
- set_delay_lines(best_delay);
-
AML_SDMMC_INFO("Clock divider %u, clock phase %u, adj delay %u, delay %u", clk.cfg_div(),
- best_phase, best_adj_delay, best_delay);
-
+ clk.cfg_tx_phase(), best_adj_delay, delay_lines);
return ZX_OK;
}
diff --git a/src/devices/board/drivers/vim3/vim3-i2c.cc b/src/devices/board/drivers/vim3/vim3-i2c.cc
index 0c3f865..6a93216 100644
--- a/src/devices/board/drivers/vim3/vim3-i2c.cc
+++ b/src/devices/board/drivers/vim3/vim3-i2c.cc
@@ -57,6 +57,13 @@
.pid = PDEV_PID_VIM3,
.did = PDEV_DID_VIM3_MCU,
},
+ {
+ .bus_id = 1,
+ .address = 0x32,
+ .vid = 0,
+ .pid = 0,
+ .did = 0,
+ },
// placeholder until driver implemented and vid/pid/did assigned
// bus_ids and addresses are correct
// TCA6408 (U17) IO expander (used for various lcd/cam signals and LEDs)
diff --git a/src/devices/board/drivers/vim3/vim3-sd.cc b/src/devices/board/drivers/vim3/vim3-sd.cc
index 4eba60b..04e7b24 100644
--- a/src/devices/board/drivers/vim3/vim3-sd.cc
+++ b/src/devices/board/drivers/vim3/vim3-sd.cc
@@ -155,7 +155,8 @@
return status;
}
-
+/*(void)comp_desc;
+*/
return ZX_OK;
}