PERFORCE change 106049 for review
Warner Losh
imp at FreeBSD.org
Wed Sep 13 00:37:27 PDT 2006
http://perforce.freebsd.org/chv.cgi?CH=106049
Change 106049 by imp at imp_lighthouse on 2006/09/13 07:36:58
Flesh out more sd support. Maybe this will even work when I
get to the office in the moring :-)
Affected files ...
.. //depot/projects/arm/src/sys/arm/at91/at91_qdmmc.c#8 edit
.. //depot/projects/arm/src/sys/arm/at91/at91_qdmmcreg.h#3 edit
Differences ...
==== //depot/projects/arm/src/sys/arm/at91/at91_qdmmc.c#8 (text+ko) ====
@@ -236,6 +236,48 @@
return 0;
}
+static uint32_t
+at91_qdmmc_GetStatus(device_t dev, uint32_t rca)
+{
+ struct at91_qdmmc_softc *sc = device_get_softc(dev);
+
+ if (at91_qdmmc_SendCommand(dev, SEND_STATUS_CMD, rca << 16) == 0)
+ return (RD4(sc, MCI_RSPR));
+ return 0xffffffff;
+}
+
+static int
+at91_qdmmc_SetBlocklength(device_t dev, uint32_t length)
+{
+ return (at91_qdmmc_SendCommand(dev, SET_BLOCKLEN_CMD, length) );
+}
+
+static int
+at91_qdmmc_SDCard_SetBusWidth(device_t dev)
+{
+ struct at91_qdmmc_softc *sc = device_get_softc(dev);
+ uint32_t ret_value, rca;
+ char bus_width;
+
+ rca = sc->cards[0].rca;
+ do {
+ ret_value = at91_qdmmc_GetStatus(dev, rca);
+ } while (ret_value != 0xffffffff &&
+ !(ret_value & AT91C_SR_READY_FOR_DATA));
+
+ // Select Card
+ at91_qdmmc_SendCommand(dev, SEL_DESEL_CARD_CMD, rca << 16);
+
+ // XXX hard code 4.
+ bus_width = AT91C_BUS_WIDTH_4BITS;
+
+ if (at91_qdmmc_SDCard_SendAppCommand(dev, SDCARD_SET_BUS_WIDTH_CMD,
+ bus_width) != 0)
+ return EIO;
+
+ return 0;
+}
+
static int
at91_qdmmc_sdcard_init(device_t dev)
{
@@ -278,44 +320,40 @@
int month = 0;
month += ((sc->cards[0].CID[3] >> 12) & 0xf);
printf("SD: Manufacturing Date = %i/%i\n", year, month);
-#if 0
- f->READ_BL_LEN = (csd[1] >> CSD_1_RD_B_LEN_S) &
+ sc->cards[0].mode = 5 * MCI_MR_CLKDIV | MCI_MR_PWSDIV |
+ (MCI_MR_PWSDIV << 1 | MCI_MR_PDCMODE);
+ sc->cards[0].mode = 75 * MCI_MR_CLKDIV | MCI_MR_PWSDIV |
+ (MCI_MR_PWSDIV << 1);
+ sc->cards[0].flags = 0;
+ if (sc->cards[0].CSD[1] & CSD_1_RD_B_PAR_M)
+ sc->cards[0].flags |= READ_PARTIAL;
+ if (sc->cards[0].CSD[3] & CSD_3_WBLOCK_P_M)
+ sc->cards[0].flags |= WRITE_PARTIAL;
+ sc->cards[0].read_bl = (csd[1] >> CSD_1_RD_B_LEN_S) &
CSD_1_RD_B_LEN_M;
- f->WRITE_BL_LEN = (csd[3] >> CSD_3_WBLEN_S) &
+ sc->cards[0].write_bl = (csd[3] >> CSD_3_WBLEN_S) &
CSD_3_WBLEN_M;
- f->Sector_Size = 1 + ((csd[2] >> CSD_2_v21_SECT_SIZE_S) &
+ bioq_init(&sc->cards[0].bio_queue);
+
+ sc->cards[0].sector_size = 1 + ((csd[2] >> CSD_2_v21_SECT_SIZE_S) &
CSD_2_v21_SECT_SIZE_M);
- f->Read_Partial = (csd[1] >> CSD_1_RD_B_PAR_S) &
- CSD_1_RD_B_PAR_M;
- f->Write_Partial = (csd[3] >> CSD_3_WBLOCK_P_S) &
- CSD_3_WBLOCK_P_M;
- f->Erase_Block_Enable = (csd[2] >> CSD_2_v21_ER_BLEN_EN_S) &
- CSD_2_v21_ER_BLEN_EN_M;
- f->Read_Block_Misalignment = (csd[1] >> CSD_1_RD_B_MIS_S) &
- CSD_1_RD_B_MIS_M;
- f->Write_Block_Misalignment = (csd[1] >> CSD_1_WR_B_MIS_S) &
- CSD_1_WR_B_MIS_M;
- //// Compute Memory Capacity
- // compute MULT
- uint32_t mult, blocknr;
- mult = 1 << ( ((csd[2] >> CSD_2_C_SIZE_M_S) &
- CSD_2_C_SIZE_M_M) + 2 );
- // compute MSB of C_SIZE
- blocknr = ((csd[1] >> CSD_1_CSIZE_H_S) &
- CSD_1_CSIZE_H_M) << 2;
- // compute MULT * (LSB of C-SIZE + MSB already computed + 1) = BLOCKNR
- blocknr = mult * ((blocknr + ((csd[2] >> CSD_2_CSIZE_L_S) &
- CSD_2_CSIZE_L_M)) + 1);
- f->Memory_Capacity = (1 << f->READ_BL_LEN) * blocknr;
- //// End of Compute Memory Capacity
+ printf("SD: Blocksize = %i Bytes\n", sc->cards[0].sector_size);
+ uint64_t c_size;
+ uint64_t c_size_mult;
+ c_size = ((sc->cards[0].CSD[1] & 0x3ff) << 2) |
+ ((sc->cards[0].CSD[2] >> 30) & 0x3);
+ printf("SD: c_size = %lld\n", c_size);
+ c_size_mult = (sc->cards[0].CSD[2] >> 15) & 0x7;
+ c_size_mult = 1 << (c_size_mult + 2);
+ printf("SD: c_size_mult = %lld\n", c_size_mult);
+ sc->cards[0].size = sc->cards[0].sector_size *
+ (c_size + 1) * c_size_mult;
+ printf("SD: Size = %lld Bytes\n", sc->cards[0].size);
if (at91_qdmmc_SDCard_SetBusWidth(dev))
return EIO;
- if (at91_qdmmc_SetBlocklength(1 << f->READ_BL_LEN) != AT91C_CMD_SEND_OK)
- return AT91C_INIT_ERROR;
- printf("Found SD card %u bytes\n", f->Memory_Capacity);
+ if (at91_qdmmc_SetBlocklength(dev, sc->cards[0].sector_size) != 0)
+ return EIO;
return 0;
-#endif
- return (EIO);
}
static int
@@ -439,8 +477,6 @@
sc->cards[card].flags |= WRITE_PARTIAL;
sc->cards[card].read_bl = 0;
sc->cards[card].write_bl = 0;
- sc->cards[card].rca = 0;
-
bioq_init(&sc->cards[0].bio_queue);
}
if (sc->nb_cards == 0)
==== //depot/projects/arm/src/sys/arm/at91/at91_qdmmcreg.h#3 (text+ko) ====
@@ -128,4 +128,7 @@
#define AT91C_NO_ARGUMENT 0x0
+#define AT91C_BUS_WIDTH_1BIT 0x00
+#define AT91C_BUS_WIDTH_4BITS 0x02
+
#endif /* ARM_AT91_AT91QDMMCREG_H */
More information about the p4-projects
mailing list