PERFORCE change 106752 for review
Warner Losh
imp at FreeBSD.org
Tue Sep 26 17:13:00 PDT 2006
http://perforce.freebsd.org/chv.cgi?CH=106752
Change 106752 by imp at imp_lighthouse on 2006/09/27 00:12:25
queue mmc commands to mmc bridge parts. now, to make the
bridge part grok it...
Affected files ...
.. //depot/projects/arm/src/sys/dev/mmc/mmc.c#5 edit
.. //depot/projects/arm/src/sys/dev/mmc/mmcbr_if.m#4 edit
.. //depot/projects/arm/src/sys/dev/mmc/mmcreg.h#6 edit
Differences ...
==== //depot/projects/arm/src/sys/dev/mmc/mmc.c#5 (text+ko) ====
@@ -62,6 +62,12 @@
static void mmc_delayed_attach(void *);
+static void
+mmc_ms_delay(int ms)
+{
+ DELAY(1000 * ms); /* XXX BAD */
+}
+
static int
mmc_probe(device_t dev)
{
@@ -132,9 +138,61 @@
}
static void
+mmc_wakeup(struct mmc_request *req)
+{
+ wakeup(req);
+}
+
+static int
+mmc_wait_for_req(struct mmc_softc *sc, struct mmc_request *req)
+{
+ int err;
+
+ req->done = mmc_wakeup;
+ MMCBR_REQUEST(device_get_parent(sc->dev), sc->dev, req);
+ MMC_LOCK(sc);
+ do {
+ err = msleep(req, &sc->sc_mtx, PZERO | PCATCH, "mmcreq",
+ hz / 10);
+ } while (!(req->flags & MMC_REQ_DONE) && err == 0);
+ MMC_UNLOCK(sc);
+ return (err);
+}
+
+static int
+mmc_wait_for_cmd(struct mmc_softc *sc, struct mmc_command *cmd, int retries)
+{
+ struct mmc_request mreq;
+
+ memset(&mreq, 0, sizeof(mreq));
+ memset(cmd->resp, 0, sizeof(cmd->resp));
+ cmd->retries = retries;
+ cmd->data = NULL;
+ mreq.cmd = cmd;
+ mmc_wait_for_req(sc, &mreq);
+ return (cmd->error);
+}
+
+static void
mmc_idle_cards(struct mmc_softc *sc)
{
- // XXX write me
+ device_t dev;
+ struct mmc_command cmd;
+
+ dev = sc->dev;
+ mmcbr_set_chip_select(dev, cs_high);
+ mmcbr_update_ios(dev);
+ mmc_ms_delay(1);
+
+ cmd.opcode = MMC_GO_IDLE_STATE;
+ cmd.arg = 0;
+ cmd.flags = MMC_RSP_NONE | MMC_CMD_BC;
+ mmc_wait_for_cmd(sc, &cmd, 0);
+ mmc_ms_delay(1);
+
+ mmcbr_set_chip_select(dev, cs_dontcare);
+ mmcbr_update_ios(dev);
+ mmc_ms_delay(1);
}
static int
@@ -164,14 +222,12 @@
mmcbr_set_power_mode(dev, power_up);
mmcbr_set_clock(dev, 0);
mmcbr_update_ios(dev);
-
- // delay 1ms ?
+ mmc_ms_delay(1);
mmcbr_set_clock(dev, mmcbr_get_f_min(sc->dev));
mmcbr_set_power_mode(dev, power_on);
mmcbr_update_ios(dev);
-
- // delay 2ms ?
+ mmc_ms_delay(2);
}
static void
==== //depot/projects/arm/src/sys/dev/mmc/mmcbr_if.m#4 (text+ko) ====
==== //depot/projects/arm/src/sys/dev/mmc/mmcreg.h#6 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#ifndef DEV_MMC_MMCREG_H
-#define DEV_MMC_MMCREG_H
+#define DEV_MMC_MMCREG_H
/*
* This file contains the register definitions for the mmc and sd busses.
@@ -40,36 +40,44 @@
uint32_t arg;
uint32_t resp[4];
uint32_t flags; /* Expected responses */
-#define MMC_RSP_NONE (0UL << 0)
-#define MMC_RSP_SHORT (1UL << 0)
-#define MMC_RSP_LONG (2UL << 0)
-#define MMC_RSP_MASK (3UL << 0)
-#define MMC_RSP_CRC (1UL << 3) /* Expect valid crc */
-#define MMC_RSP_BUSY (1UL << 4) /* Card may send busy */
+#define MMC_RSP_PRESENT (1ul << 0) /* Response */
+#define MMC_RSP_136 (1ul << 1) /* 136 bit response */
+#define MMC_RSP_CRC (1ul << 2) /* Expect valid crc */
+#define MMC_RSP_BUSY (1ul << 3) /* Card may send busy */
+#define MMC_RSP_OPCODE (1ul << 4) /* Response include opcode */
+#define MMC_CMD_AC (0ul << 5) /* AC? */
+#define MMC_CMD_ADTC (1ul << 5) /* ADTC? */
+#define MMC_CMD_BC (2ul << 5) /* BC? */
+#define MMC_CMD_BCR (3ul << 5) /* BCR? */
+#define MMC_RSP_MASK 0x1ful
+#define MMC_CMD_MASK (3ul << 5)
/* Possible response types defined in the standard: */
-#define MMC_RSP_R1 (MMC_RSP_SHORT | MMC_RSP_CRC)
-#define MMC_RSP_R1B (MMC_RSP_SHORT | MMC_RSP_CRC | MMC_RSP_BUSY)
-#define MMC_RSP_R2 (MMC_RSP_LONG | MMC_RSP_CRC)
-#define MMC_RSP_R3 (MMC_RSP_SHORT)
-#define MMC_RSP_R6 (MMC_RSP_SHORT | MMC_RSP_CRC)
- uint32_t retires;
+#define MMC_RSP_NONE (0)
+#define MMC_RSP_R1 (MMC_RPS_PRESENT | MMC_RSP_CRC | MMC_RSP_OPCODE)
+#define MMC_RSP_R1B (MMC_RSP_PRESENT | MMC_RSP_CRC | MMC_RSP_OPCODE | MMC_RSP_BUSY)
+#define MMC_RSP_R2 (MMC_RSP_PRESENT | MMC_RSP_136 | MMC_RSP_CRC)
+#define MMC_RSP_R3 (MMC_RSP_PRESENT)
+#define MMC_RSP_R6 (MMC_RSP_PRESENT | MMC_RSP_CRC)
+/* R7 -- new in sd 2.0 */
+#define MMC_RSP(x) ((x) & MMC_RSP_MASK)
+ uint32_t retries;
uint32_t error;
-#define MMC_ERR_NONE 0
-#define MMC_ERR_TIMEOUT 1
-#define MMC_ERR_BADCRC 2
-#define MMC_ERR_FIFO 3
-#define MMC_ERR_FAILED 4
-#define MMC_ERR_INVALID 5
+#define MMC_ERR_NONE 0
+#define MMC_ERR_TIMEOUT 1
+#define MMC_ERR_BADCRC 2
+#define MMC_ERR_FIFO 3
+#define MMC_ERR_FAILED 4
+#define MMC_ERR_INVALID 5
struct mmc_data *data; /* Data segment with cmd */
struct mmc_request *mrq; /* backpointer to request */
};
struct mmc_data {
uint32_t flags;
-#define MMC_DATA_WRITE (1UL << 8)
-#define MMC_DATA_READ (1UL << 9)
-#define MMC_DATA_STREAM (1UL << 10)
+#define MMC_DATA_WRITE (1UL << 8)
+#define MMC_DATA_READ (1UL << 9)
+#define MMC_DATA_STREAM (1UL << 10)
struct mmc_request *mrq;
};
@@ -79,17 +87,122 @@
struct mmc_command *stop;
void (*done)(struct mmc_request *); /* Completion function */
void *done_data; /* requestor set data */
+ uint32_t flags;
+#define MMC_REQ_DONE 1
};
+/* Command definitions */
+
+/* Class 0 and 1: Basic commands & read stream commands */
+#define MMC_GO_IDLE_STATE 0
+#define MMC_SEND_OP_COND 1
+#define MMC_ALL_SEND_CID 2
+#define MMC_SET_RELATIVE_ADDR 3
+#define MMC_SET_DSR 4
+ /* reserved: 5 */
+#define MMC_SELECT_CARD 7
+#define MMC_DESELECT_CARD 7
+#define MMC_SEND_IF_COND 8
+#define MMC_SEND_CSD 9
+#define MMC_SEND_CID 10
+#define MMC_READ_DAT_UNTIL_STOP 11
+#define MMC_STOP_TRANSMISSION 12
+#define MMC_SEND_STATUS 13
+ /* reserved: 14 */
+#define MMC_GO_INACTIVE_STATE 15
+
+/* Class 2: Block oriented read commands */
+#define MMC_SET_BLOCKLEN 16
+#define MMC_READ_SINGLE_BLOCK 17
+#define MMC_READ_MULTIPLE_BLOCK 18
+ /* reserved: 19 */
+
+/* Class 3: Stream write commands */
+#define MMC_WRITE_DAT_UNTIL_STOP 20
+ /* reserved: 21 */
+ /* reserved: 22 */
+
+/* Class 4: Block oriented write commands */
+#define MMC_SET_BLOCK_COUNT 23
+#define MMC_WRITE_BLOCK 24
+#define MMC_WRITE_MULTIPLE_BLOCK 25
+#define MMC_PROGARM_CID 26
+#define MMC_PROGRAM_CSD 27
+
+/* Class 6: Block oriented write protection commands */
+#define MMC_SET_WRITE_PROT 28
+#define MMC_CLR_WRITE_PROT 29
+#define MMC_SEND_WRITE_PROT 30
+ /* reserved: 31 */
+
+/* Class 5: Erase commands */
+#define SD_ERASE_WR_BLK_START 32
+#define SD_ERASE_WR_BLK_END 33
+ /* 34 -- reserved old command */
+#define MMC_ERASE_GROUP_START 35
+#define MMC_ERASE_GROUP_END 36
+ /* 37 -- reserved old command */
+#define MMC_ERASE 38
+
+/* Class 9: I/O mode commands */
+#define MMC_FAST_IO 39
+#define MMC_GO_IRQ_STATE 40
+ /* reserved: 41 */
+
+/* Class 7: Lock card */
+#define MMC_LOCK_UNLOCK 42
+ /* reserved: 43 */
+ /* reserved: 44 */
+ /* reserved: 45 */
+ /* reserved: 46 */
+ /* reserved: 47 */
+ /* reserved: 48 */
+ /* reserved: 49 */
+ /* reserved: 50 */
+ /* reserved: 51 */
+ /* reserved: 54 */
+
+/* Class 8: Application specific commands */
+#define MMC_APP_CMD 55
+#define MMC_GEN_CMD 56
+ /* reserved: 57 */
+ /* reserved: 58 */
+ /* reserved: 59 */
+ /* reserved for mfg: 60 */
+ /* reserved for mfg: 61 */
+ /* reserved for mfg: 62 */
+ /* reserved for mfg: 63 */
+
+/* Class 9: I/O cards (sd) */
+#define SD_IO_RW_DIRECT 52
+#define SD_IO_RW_EXTENDED 53
+
+/* Class 10: Switch function commands */
+#define SD_SWITCH_FUNC 6
+ /* reserved: 34 */
+ /* reserved: 35 */
+ /* reserved: 36 */
+ /* reserved: 37 */
+ /* reserved: 50 */
+ /* reserved: 57 */
+
+
+/* Application specific commands for SD */
+#define ACMD_SET_BUS_WIDTH 6
+#define ACMD_SD_STATUS 13
+#define ACMD_SEND_NUM_WR_BLOCKS 22
+#define ACMD_SET_WR_BLK_ERASE_COUNT 23
+#define ACMD_SD_SEND_OP_COND 41
+#define ACMD_SET_CLR_CARD_DETECT 42
+#define ACMD_SEND_SCR 51
+
/* OCR bits */
-#define MMC_OCR_145_150 (1U << 0) /* Vdd voltage 1.45 ~ 1.50 */
-#define MMC_OCR_150_155 (1U << 1) /* Vdd voltage 1.50 ~ 1.50 */
-#define MMC_OCR_155_160 (1U << 2) /* Vdd voltage 1.55 ~ 1.60 */
-#define MMC_OCR_160_165 (1U << 3) /* Vdd voltage 1.60 ~ 1.65 */
-#define MMC_OCR_165_170 (1U << 4) /* Vdd voltage 1.65 ~ 1.70 */
-#define MMC_OCR_170_180 (1U << 5) /* Vdd voltage 1.70 ~ 1.80 */
-#define MMC_OCR_180_190 (1U << 6) /* Vdd voltage 1.80 ~ 1.90 */
-#define MMC_OCR_190_200 (1U << 7) /* Vdd voltage 1.90 ~ 2.00 */
+
+/* in SD 2.0 spec, bits 8-14 are now marked reserved */
+/* Low voltage in SD2.0 spec is bit 7, TBD voltage */
+/* Low voltage in MC 3.31 spec is bit 7, 1.65-1.95V */
+/* Linux has defines for lower bits down to 0, for reasons unknown */
+#define MMC_OCR_LOW_VOLTAGE (1u << 7) /* Low Voltage Range -- tbd */
#define MMC_OCR_200_210 (1U << 8) /* Vdd voltage 2.00 ~ 2.10 */
#define MMC_OCR_210_220 (1U << 9) /* Vdd voltage 2.10 ~ 2.20 */
#define MMC_OCR_220_230 (1U << 10) /* Vdd voltage 2.20 ~ 2.30 */
@@ -106,6 +219,7 @@
#define MMC_OCR_330_340 (1U << 21) /* Vdd voltage 3.30 ~ 3.40 */
#define MMC_OCR_340_350 (1U << 22) /* Vdd voltage 3.40 ~ 3.50 */
#define MMC_OCR_350_360 (1U << 23) /* Vdd voltage 3.50 ~ 3.60 */
-#define MMC_OCR_CARD_BUSY (1U << 31) /* Card Power up status */
+#define MMC_OCR_CCS (1u << 30) /* Card Capacity status (SD vs SDHC) */
+#define MMC_OCR_CARD_BUSY (1U << 31) /* Card Power up status */
#endif /* DEV_MMCREG_H */
More information about the p4-projects
mailing list