PERFORCE change 106862 for review
Warner Losh
imp at FreeBSD.org
Thu Sep 28 20:46:43 PDT 2006
http://perforce.freebsd.org/chv.cgi?CH=106862
Change 106862 by imp at imp_lighthouse on 2006/09/29 03:46:00
continue writing the code to probe for cards. Getting close
to needing to write the flash driver itself...
Affected files ...
.. //depot/projects/arm/src/sys/arm/at91/at91_mci.c#12 edit
.. //depot/projects/arm/src/sys/dev/mmc/bridge.h#5 edit
.. //depot/projects/arm/src/sys/dev/mmc/mmc.c#8 edit
Differences ...
==== //depot/projects/arm/src/sys/arm/at91/at91_mci.c#12 (text+ko) ====
@@ -56,6 +56,7 @@
#include <arm/at91/at91_pdcreg.h>
#include <dev/mmc/bridge.h>
#include <dev/mmc/mmcreg.h>
+#include <dev/mmc/mmcbrvar.h>
#include "mmcbr_if.h"
@@ -337,10 +338,8 @@
#endif
if (cmd->opcode == MMC_STOP_TRANSMISSION)
cmdr |= MCI_CMDR_TRCMD_STOP;
-#if 0
- if (??? == opendrain)
+ if (sc->host.ios.bus_mode == opendrain)
cmdr |= MCI_CMDR_OPDCMD;
-#endif
if (!cmd->data) {
at91_mci_pdc_disable(sc);
WR4(sc, MCI_ARGR, cmd->arg);
@@ -432,32 +431,7 @@
return (0);
}
-static device_method_t at91_mci_methods[] = {
- /* device_if */
- DEVMETHOD(device_probe, at91_mci_probe),
- DEVMETHOD(device_attach, at91_mci_attach),
- DEVMETHOD(device_detach, at91_mci_detach),
-
- /* mmcbr_if */
- DEVMETHOD(mmcbr_update_ios, at91_mci_update_ios),
- DEVMETHOD(mmcbr_request, at91_mci_request),
- DEVMETHOD(mmcbr_get_ro, at91_mci_get_ro),
- DEVMETHOD(mmcbr_acquire_host, at91_mci_acquire_host),
- DEVMETHOD(mmcbr_release_host, at91_mci_release_host),
-
- {0, 0},
-};
-static driver_t at91_mci_driver = {
- "at91_mci",
- at91_mci_methods,
- sizeof(struct at91_mci_softc),
-};
-static devclass_t at91_mci_devclass;
-
-
-DRIVER_MODULE(at91_mci, atmelarm, at91_mci_driver, at91_mci_devclass, 0, 0);
-
static void
at91_mci_intr(void *arg)
{
@@ -523,10 +497,129 @@
}
}
if (done) {
- if (cmd != NULL)
- for (i = 0; i < 4; i++)
- cmd->resp[i] = RD4(sc, MCI_RSPR + (i << 2));
+ if (cmd != NULL) {
+ for (i = 0; i < ((cmd->flags & MMC_RSP_136) ? 4 : 1);
+ i++) {
+ cmd->resp[i] = RD4(sc, MCI_RSPR + i * 4);
+ printf("RSPR[%d] = %x\n", i, cmd->resp[i]);
+ }
+ }
at91_mci_start(sc);
}
AT91_MCI_UNLOCK(sc);
}
+
+static int
+at91_mci_read_ivar(device_t bus, device_t child, int which, u_char *result)
+{
+ struct at91_mci_softc *sc = device_get_softc(bus);
+
+ switch (which) {
+ default:
+ return (EINVAL);
+ case MMCBR_IVAR_BUS_MODE:
+ *(int *)result = sc->host.ios.bus_mode;
+ break;
+ case MMCBR_IVAR_BUS_WIDTH:
+ *(int *)result = sc->host.ios.bus_width;
+ break;
+ case MMCBR_IVAR_CHIP_SELECT:
+ *(int *)result = sc->host.ios.chip_select;
+ break;
+ case MMCBR_IVAR_CLOCK:
+ *(int *)result = sc->host.ios.clock;
+ break;
+ case MMCBR_IVAR_F_MIN:
+ *(int *)result = sc->host.f_min;
+ break;
+ case MMCBR_IVAR_F_MAX:
+ *(int *)result = sc->host.f_max;
+ break;
+ case MMCBR_IVAR_HOST_OCR:
+ *(int *)result = sc->host.host_ocr;
+ break;
+ case MMCBR_IVAR_MODE:
+ *(int *)result = sc->host.mode;
+ break;
+ case MMCBR_IVAR_OCR:
+ *(int *)result = sc->host.ocr;
+ break;
+ case MMCBR_IVAR_POWER_MODE:
+ *(int *)result = sc->host.ios.power_mode;
+ break;
+ case MMCBR_IVAR_VDD:
+ *(int *)result = sc->host.ios.vdd;
+ break;
+ }
+ return (0);
+}
+
+static int
+at91_mci_write_ivar(device_t bus, device_t child, int which, uintptr_t value)
+{
+ struct at91_mci_softc *sc = device_get_softc(bus);
+
+ switch (which) {
+ default:
+ return (EINVAL);
+ case MMCBR_IVAR_BUS_MODE:
+ sc->host.ios.bus_mode = value;
+ break;
+ case MMCBR_IVAR_BUS_WIDTH:
+ sc->host.ios.bus_width = value;
+ break;
+ case MMCBR_IVAR_CHIP_SELECT:
+ sc->host.ios.chip_select = value;
+ break;
+ case MMCBR_IVAR_CLOCK:
+ sc->host.ios.clock = value;
+ break;
+ case MMCBR_IVAR_MODE:
+ sc->host.mode = value;
+ break;
+ case MMCBR_IVAR_OCR:
+ sc->host.ocr = value;
+ break;
+ case MMCBR_IVAR_POWER_MODE:
+ sc->host.ios.power_mode = value;
+ break;
+ case MMCBR_IVAR_VDD:
+ sc->host.ios.vdd = value;
+ break;
+ case MMCBR_IVAR_HOST_OCR:
+ case MMCBR_IVAR_F_MIN:
+ case MMCBR_IVAR_F_MAX:
+ return (EINVAL);
+ }
+ return (0);
+}
+
+static device_method_t at91_mci_methods[] = {
+ /* device_if */
+ DEVMETHOD(device_probe, at91_mci_probe),
+ DEVMETHOD(device_attach, at91_mci_attach),
+ DEVMETHOD(device_detach, at91_mci_detach),
+
+ /* Bus interface */
+ DEVMETHOD(bus_read_ivar, at91_mci_read_ivar),
+ DEVMETHOD(bus_write_ivar, at91_mci_write_ivar),
+
+ /* mmcbr_if */
+ DEVMETHOD(mmcbr_update_ios, at91_mci_update_ios),
+ DEVMETHOD(mmcbr_request, at91_mci_request),
+ DEVMETHOD(mmcbr_get_ro, at91_mci_get_ro),
+ DEVMETHOD(mmcbr_acquire_host, at91_mci_acquire_host),
+ DEVMETHOD(mmcbr_release_host, at91_mci_release_host),
+
+ {0, 0},
+};
+
+static driver_t at91_mci_driver = {
+ "at91_mci",
+ at91_mci_methods,
+ sizeof(struct at91_mci_softc),
+};
+static devclass_t at91_mci_devclass;
+
+
+DRIVER_MODULE(at91_mci, atmelarm, at91_mci_driver, at91_mci_devclass, 0, 0);
==== //depot/projects/arm/src/sys/dev/mmc/bridge.h#5 (text+ko) ====
@@ -59,7 +59,7 @@
vdd_330, vdd_340, vdd_350, vdd_360
};
-enum mmc_poewr_mode {
+enum mmc_power_mode {
power_off = 0, power_up, power_on
};
@@ -81,6 +81,7 @@
enum mmc_bus_mode bus_mode;
enum mmc_chip_select chip_select;
enum mmc_bus_width bus_width;
+ enum mmc_power_mode power_mode;
};
enum mmc_card_mode {
@@ -91,6 +92,7 @@
int f_min;
int f_max;
uint32_t host_ocr;
+ uint32_t ocr;
uint32_t caps;
#define MMC_CAP_4_BIT_DATA (1 << 0) /* Can do 4-bit data transfers */
#define MMC_CAP_8_BIT_DATA (1 << 1) /* Can do 8-bit data transfers */
==== //depot/projects/arm/src/sys/dev/mmc/mmc.c#8 (text+ko) ====
@@ -126,6 +126,8 @@
static uint32_t
mmc_select_vdd(struct mmc_softc *sc, uint32_t ocr)
{
+ // XXX
+ return ocr;
}
static int
@@ -237,6 +239,7 @@
for (i = 0; i < 100; i++) {
err = mmc_wait_for_app_cmd(sc, 0, &cmd, CMD_RETRIES);
+ printf("err is %x busy is %x\n", err, cmd.resp[0]);
if (err != MMC_ERR_NONE)
break;
if ((cmd.resp[0] & MMC_OCR_CARD_BUSY) || ocr == 0)
@@ -246,6 +249,7 @@
}
if (rocr && err == MMC_ERR_NONE)
*rocr = cmd.resp[0];
+ printf("app op sayz %x\n", cmd.resp[0]);
return err;
}
@@ -298,6 +302,29 @@
static void
mmc_discover_cards(struct mmc_softc *sc)
{
+#if 0 // XXX XXX XXX
+ while (1) {
+ err = mmc_all_send_cid(sc, &rca);
+ if (err == MMC_ERR_TIMEOUT) {
+ err = MMC_ERR_NONE;
+ break;
+ }
+ if (err != MMC_ERR_NONE) {
+ printf("Error reading CID %d\n", err);
+ break;
+ }
+ card = find_card(sc, rca);
+ if (host->mode == MMC_MODE_SD) {
+ mmc_card_set_sd(card);
+ mmc_send_relative_addr(sc, 0);
+ card->rca = cmd.resp[0] >> 16;
+ // RO check
+ break;
+ }
+ // MMC XXX card detection
+ // set relative addr
+ }
+#endif
}
static void
@@ -322,12 +349,13 @@
mmcbr_set_mode(dev, mode_sd);
mmc_power_up(sc);
mmc_idle_cards(sc);
- if (mmc_send_app_op_cond(sc, 0, &ocr)) {
+ if (mmc_send_app_op_cond(sc, 0, &ocr) != MMC_ERR_NONE) {
// Failed, try MMC
mmcbr_set_mode(dev, mode_mmc);
- if (mmc_send_op_cond(sc, 0, &ocr))
+ if (mmc_send_op_cond(sc, 0, &ocr) != MMC_ERR_NONE)
return; // Failed both, punt! XXX power down?
}
+ printf("OCR IS %x\n", ocr);
mmcbr_set_ocr(dev, mmc_select_vdd(sc, ocr));
if (mmcbr_get_ocr(dev) != 0)
mmc_idle_cards(sc);
@@ -341,8 +369,9 @@
* Make sure that we have a mutually agreeable voltage to at least
* one card on the bus.
*/
- if (mmcbr_get_ocr(dev) == 0)
- return;
+ printf("Oink %x!\n", mmcbr_get_ocr(dev));
+// if (mmcbr_get_ocr(dev) == 0)
+// return;
/* XXX Linux re-sends op_cond command here */
mmc_discover_cards(sc);
More information about the p4-projects
mailing list