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