[SeaBIOS] Failure to detect high-capacity SD card

Kevin O'Connor kevin at koconnor.net
Thu Oct 26 18:26:33 CEST 2017


On Thu, Oct 26, 2017 at 11:14:53AM -0400, Matt DeVillier wrote:
> On Thu, Oct 26, 2017 at 10:59 AM, Kevin O'Connor <kevin at koconnor.net> wrote:
> 
> > On Thu, Oct 26, 2017 at 10:46:06AM -0400, Matt DeVillier wrote:
> > > On Thu, Oct 26, 2017 at 12:56 AM, Kevin O'Connor <kevin at koconnor.net>
> > wrote:
> > >
> > > > Does the patch below help?
> > > >
> > > > -Kevin
> > > >
> > > >
> > > > --- a/src/hw/sdcard.c
> > > > +++ b/src/hw/sdcard.c
> > > > @@ -405,6 +405,7 @@ sdcard_card_setup(struct sddrive_s *drive, int
> > volt,
> > > > int prio)
> > > >      if (!ret && param[0] == vrange)
> > > >          hcs = (1<<30);
> > > >      // Verify SD card (instead of MMC or SDIO)
> > > > +#if 0
> > > >      param[0] = 0x00;
> > > >      ret = sdcard_pio_app(regs, SC_APP_SEND_OP_COND, param);
> > > >      if (ret) {
> > > > @@ -416,6 +417,7 @@ sdcard_card_setup(struct sddrive_s *drive, int
> > volt,
> > > > int prio)
> > > >          drive->card_type |= SF_MMC;
> > > >          hcs = (1<<30);
> > > >      }
> > > > +#endif
> > > >      // Init card
> > > >      u32 end = timer_calc(SDHCI_POWERUP_TIMEOUT);
> > > >      for (;;) {
> > > >
> > >
> > > with the patch applied, neither the internal eMMC nor the large-capacity
> > > external SD card are detected
> >
> > Yeah - this disables MMC.  Any chance to get the log from this run?
> > (Let me know if eMMC is needed to get the log.)
> >
> > -Kevin
> >
> 
> with the patch, USB devices are not available from the boot menu either (it
> appears to hang?), and therefore device cannot be booted to get said log

That sounds like a bad compile then - nothing in the patch should have
impacted usb.

In any case, the patch below tests the same thing and it should work
on eMMC also.

-Kevin


--- a/src/hw/sdcard.c
+++ b/src/hw/sdcard.c
@@ -404,19 +404,8 @@ sdcard_card_setup(struct sddrive_s *drive, int volt, int prio)
     ret = sdcard_pio(regs, SC_SEND_IF_COND, param);
     if (!ret && param[0] == vrange)
         hcs = (1<<30);
-    // Verify SD card (instead of MMC or SDIO)
-    param[0] = 0x00;
-    ret = sdcard_pio_app(regs, SC_APP_SEND_OP_COND, param);
-    if (ret) {
-        // Check for MMC card
-        param[0] = 0x00;
-        ret = sdcard_pio(regs, SC_SEND_OP_COND, param);
-        if (ret)
-            return ret;
-        drive->card_type |= SF_MMC;
-        hcs = (1<<30);
-    }
     // Init card
+    int firstloop = 1;
     u32 end = timer_calc(SDHCI_POWERUP_TIMEOUT);
     for (;;) {
         param[0] = hcs | volt; // high-capacity support and voltage level
@@ -424,8 +413,18 @@ sdcard_card_setup(struct sddrive_s *drive, int volt, int prio)
             ret = sdcard_pio(regs, SC_SEND_OP_COND, param);
         else
             ret = sdcard_pio_app(regs, SC_APP_SEND_OP_COND, param);
-        if (ret)
+        if (ret) {
+            if (firstloop) {
+                // Check for MMC card
+                firstloop = 0;
+                drive->card_type |= SF_MMC;
+                hcs = (1<<30);
+                end = timer_calc(SDHCI_POWERUP_TIMEOUT);
+                continue;
+            }
             return ret;
+        }
+        firstloop = 0;
         if (param[0] & SR_OCR_NOTBUSY)
             break;
         if (timer_check(end)) {



More information about the SeaBIOS mailing list