From owner-p4-projects@FreeBSD.ORG Wed Sep 13 07:37:27 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 447FA16A415; Wed, 13 Sep 2006 07:37:27 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id EAA4116A407 for ; Wed, 13 Sep 2006 07:37:26 +0000 (UTC) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id A8C6E43D45 for ; Wed, 13 Sep 2006 07:37:26 +0000 (GMT) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k8D7bQPE059063 for ; Wed, 13 Sep 2006 07:37:26 GMT (envelope-from imp@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k8D7bQrE059060 for perforce@freebsd.org; Wed, 13 Sep 2006 07:37:26 GMT (envelope-from imp@freebsd.org) Date: Wed, 13 Sep 2006 07:37:26 GMT Message-Id: <200609130737.k8D7bQrE059060@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to imp@freebsd.org using -f From: Warner Losh To: Perforce Change Reviews Cc: Subject: PERFORCE change 106049 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 13 Sep 2006 07:37:27 -0000 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 */