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>