Date: Wed, 13 Sep 2006 07:10:52 GMT From: Warner Losh <imp@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 106047 for review Message-ID: <200609130710.k8D7AqN6057077@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=106047 Change 106047 by imp@imp_lighthouse on 2006/09/13 07:09:53 Checkpoint again... SD detection should work, but we always fail because the block size computation isn't yet finished. Affected files ... .. //depot/projects/arm/src/sys/arm/at91/at91_qdmmc.c#7 edit Differences ... ==== //depot/projects/arm/src/sys/arm/at91/at91_qdmmc.c#7 (text+ko) ==== @@ -126,7 +126,8 @@ #define AT91_QDMMC_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED); static int -at91_qdmmc_SendCommand(device_t dev, uint32_t cmd, uint32_t arg) { +at91_qdmmc_SendCommand(device_t dev, uint32_t cmd, uint32_t arg) +{ struct at91_qdmmc_softc *sc = device_get_softc(dev); uint32_t error; @@ -152,6 +153,33 @@ } static int +at91_qdmmc_SDCard_SendAppCommand(device_t dev, uint32_t cmd, uint32_t arg) +{ + uint32_t status; + struct at91_qdmmc_softc *sc = device_get_softc(dev); + + // Send the CMD55 for application specific command + WR4(sc, MCI_ARGR, sc->cards[0].rca << 16); + WR4(sc, MCI_CMDR, APP_CMD); + + // wait for CMDRDY Status flag to read the response + do + { + status = RD4(sc, MCI_SR); + } while(!(status & MCI_SR_CMDRDY)); + + // if an error occurs + if ((status & MCI_SR_ERROR) != 0 ) + return (status & MCI_SR_ERROR); + + // check if it is a specific command and then send the command + if ((cmd & SDCARD_APP_ALL_CMD) == 0) + return MCI_SR_ERROR; + + return (at91_qdmmc_SendCommand(dev, cmd, arg)); +} + +static int at91_qdmmc_probe(device_t dev) { @@ -160,7 +188,6 @@ return (0); } -#if 0 static int at91_qdmmc_SDCard_GetOCR(device_t dev) { @@ -180,68 +207,115 @@ return (response); } -#endif + +static int +at91_qdmmc_SDCard_GetCID(device_t dev, uint32_t *response) +{ + struct at91_qdmmc_softc *sc = device_get_softc(dev); + + if (at91_qdmmc_SendCommand(dev, ALL_SEND_CID_CMD, AT91C_NO_ARGUMENT)) + return EIO; + response[0] = RD4(sc, MCI_RSPR + 0 * sizeof(response[0])); + response[1] = RD4(sc, MCI_RSPR + 1 * sizeof(response[0])); + response[2] = RD4(sc, MCI_RSPR + 2 * sizeof(response[0])); + response[3] = RD4(sc, MCI_RSPR + 3 * sizeof(response[0])); + return 0; +} + +static int +at91_qdmmc_GetCSD(device_t dev, uint32_t rca, uint32_t *response) +{ + struct at91_qdmmc_softc *sc = device_get_softc(dev); + + if (at91_qdmmc_SendCommand(dev, SEND_CSD_CMD, rca << 16)) + return EIO; + response[0] = RD4(sc, MCI_RSPR + 0 * sizeof(response[0])); + response[1] = RD4(sc, MCI_RSPR + 1 * sizeof(response[0])); + response[2] = RD4(sc, MCI_RSPR + 2 * sizeof(response[0])); + response[3] = RD4(sc, MCI_RSPR + 3 * sizeof(response[0])); + return 0; +} static int at91_qdmmc_sdcard_init(device_t dev) { -#if 0 struct at91_qdmmc_softc *sc = device_get_softc(dev); - unsigned int tab_response[4]; - unsigned int mult,blocknr; + uint32_t *csd; at91_qdmmc_SendCommand(dev, GO_IDLE_STATE_CMD, AT91C_NO_ARGUMENT); if (at91_qdmmc_SDCard_GetOCR(dev) == -1) return ENXIO; - f = pMCI_Device->pMCI_DeviceFeatures; - if (at91_qdmmc_SDCard_GetCID(tab_response) != 0) - return AT91C_INIT_ERROR; - f->Card_Inserted = AT91C_SD_CARD_INSERTED; - if (at91_qdmmc_SendCommand(SET_RELATIVE_ADDR_CMD, 0) != 0) - return AT91C_INIT_ERROR; - f->Relative_Card_Address = (AT91C_BASE_MCI->MCI_RSPR[0] >> 16); - if (at91_qdmmc_GetCSD(f->Relative_Card_Address,tab_response) - != AT91C_CMD_SEND_OK) - return AT91C_INIT_ERROR; - f->READ_BL_LEN = (tab_response[1] >> CSD_1_RD_B_LEN_S) & + csd = &sc->cards[0].CSD[0]; + if (at91_qdmmc_SDCard_GetCID(dev, csd) != 0) + return ENXIO; + if (at91_qdmmc_SendCommand(dev, SET_RELATIVE_ADDR_CMD, 0) != 0) + return ENXIO; + sc->cards[0].rca = RD4(sc, MCI_RSPR) >> 16; + if (at91_qdmmc_GetCSD(dev, sc->cards[0].rca, csd) != 0) + return ENXIO; + printf("Found SD Card - CID = 0x%x%x%x%x\n", + sc->cards[0].CID[0], + sc->cards[0].CID[1], + sc->cards[0].CID[2], + sc->cards[0].CID[3]); + printf("SD: Vendor-ID = 0x%x\n", sc->cards[0].CID[0] >> 24); + printf("SD: OEM-ID = 0x%x\n", (sc->cards[0].CID[0] >> 8) & 0xffff); + sc->cards[0].name[0] = (sc->cards[0].CID[0] >> 0) & 0xff; + sc->cards[0].name[1] = (sc->cards[0].CID[1] >> 24) & 0xff; + sc->cards[0].name[2] = (sc->cards[0].CID[1] >> 16) & 0xff; + sc->cards[0].name[3] = (sc->cards[0].CID[1] >> 8) & 0xff; + sc->cards[0].name[4] = (sc->cards[0].CID[1] >> 0) & 0xff; + sc->cards[0].name[5] = (sc->cards[0].CID[2] >> 24) & 0xff; + sc->cards[0].name[6] = '\0'; + printf("SD: Productname = %s\n", sc->cards[0].name); + printf("SD: Revision = 0x%x\n", (sc->cards[0].CID[2] >> 16) & 0xff); + printf("SD: Serial = 0x%x\n", (sc->cards[0].CID[2] << 16) | + (sc->cards[0].CID[3] >> 16)); + int year = 1997; + year += ((sc->cards[0].CID[3] >> 8) & 0xf); + 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) & CSD_1_RD_B_LEN_M; - f->WRITE_BL_LEN = (tab_response[3] >> CSD_3_WBLEN_S) & + f->WRITE_BL_LEN = (csd[3] >> CSD_3_WBLEN_S) & CSD_3_WBLEN_M; - f->Sector_Size = 1 + ((tab_response[2] >> CSD_2_v21_SECT_SIZE_S) & + f->Sector_Size = 1 + ((csd[2] >> CSD_2_v21_SECT_SIZE_S) & CSD_2_v21_SECT_SIZE_M); - f->Read_Partial = (tab_response[1] >> CSD_1_RD_B_PAR_S) & + f->Read_Partial = (csd[1] >> CSD_1_RD_B_PAR_S) & CSD_1_RD_B_PAR_M; - f->Write_Partial = (tab_response[3] >> CSD_3_WBLOCK_P_S) & + f->Write_Partial = (csd[3] >> CSD_3_WBLOCK_P_S) & CSD_3_WBLOCK_P_M; - f->Erase_Block_Enable = (tab_response[2] >> CSD_2_v21_ER_BLEN_EN_S) & + f->Erase_Block_Enable = (csd[2] >> CSD_2_v21_ER_BLEN_EN_S) & CSD_2_v21_ER_BLEN_EN_M; - f->Read_Block_Misalignment = (tab_response[1] >> CSD_1_RD_B_MIS_S) & + f->Read_Block_Misalignment = (csd[1] >> CSD_1_RD_B_MIS_S) & CSD_1_RD_B_MIS_M; - f->Write_Block_Misalignment = (tab_response[1] >> CSD_1_WR_B_MIS_S) & + f->Write_Block_Misalignment = (csd[1] >> CSD_1_WR_B_MIS_S) & CSD_1_WR_B_MIS_M; //// Compute Memory Capacity // compute MULT - mult = 1 << ( ((tab_response[2] >> CSD_2_C_SIZE_M_S) & + 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 = ((tab_response[1] >> CSD_1_CSIZE_H_S) & + 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 + ((tab_response[2] >> CSD_2_CSIZE_L_S) & + 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 - if (at91_qdmmc_SDCard_SetBusWidth(pMCI_Device) != AT91C_CMD_SEND_OK) - return AT91C_INIT_ERROR; + 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); - return (0); -#else - return (ENXIO); + return 0; #endif + return (EIO); } static int
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200609130710.k8D7AqN6057077>