Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 13 Sep 2006 07:37:26 GMT
From:      Warner Losh <imp@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 106049 for review
Message-ID:  <200609130737.k8D7bQrE059060@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=106049

Change 106049 by imp@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 */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200609130737.k8D7bQrE059060>