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;
 }