Annotation of funnyos/dev/sdmmc/sdmmc_spi.c, Revision 1.1
1.1 ! nbrk 1: /*
! 2: * $Id$
! 3: */
! 4: #include <sys/types.h>
! 5: #include <sys/device.h>
! 6: #include <sys/bus_spi.h>
! 7:
! 8: #include <dev/sdmmc/sdmmcvar.h>
! 9: #include <libkern/printf.h>
! 10:
! 11: /*
! 12: * SD/MMC conversation over SPI bus.
! 13: */
! 14: struct spisdmmc_dd {
! 15: struct spi_bus_handle *ss_sbhp;
! 16:
! 17: // struct sdmmc_bus_handle;
! 18: };
! 19:
! 20: int spisdmmc_attach(struct device *, uint32_t, uint8_t);
! 21:
! 22: struct driver spisdmmc_dr = {
! 23: sizeof(struct spisdmmc_dd),
! 24: spisdmmc_attach,
! 25: NULL,
! 26: NULL
! 27: };
! 28:
! 29:
! 30: int
! 31: spisdmmc_attach(struct device *self, uint32_t loc, uint8_t flags)
! 32: {
! 33: struct spisdmmc_dd *ddp = self->dv_devdata;
! 34: ddp->ss_sbhp = self->dv_parent->dv_aux;
! 35:
! 36: printf("SPI SD/MMC\n");
! 37:
! 38: return(0);
! 39: }
! 40:
! 41:
! 42: int
! 43: spisdmmc_init(struct spisdmmc_dd *ddp)
! 44: {
! 45: uint8_t i, resp;
! 46:
! 47: /*
! 48: * Apply 80 clock pulses.
! 49: * XXX assert CS. (NPCS0)
! 50: */
! 51: for (i = 0; i < 9; i++)
! 52: spi_transmit(ddp->ss_sbhp, 0xff);
! 53:
! 54: /*
! 55: * Apply 16 clocks.
! 56: * XXX deassert CS.
! 57: */
! 58: for (i = 0; i < 2; i ++)
! 59: spi_transmit(ddp->ss_sbhp, 0xff);
! 60:
! 61: /*
! 62: * Send CMD0_GO_IDLE_STATE.
! 63: */
! 64: spisdmmc_send_command(ddp, CMD0_GO_IDLE_STATE, 0, CMD0_HARDCODED_CRC);
! 65: if (spisdmmc_get_response(ddp) != 0) {
! 66: printf("spisdmmc_init: CMD0_GO_IDLE_STATE failed with %d\n", resp);
! 67:
! 68: return(-1);
! 69: }
! 70:
! 71: }
! 72:
! 73:
! 74: void
! 75: spisdmmc_send_command(struct spisdmmc_dd *ddp, uint8_t cmd, uint32_t arg, uint32_t crc)
! 76: {
! 77: struct sdmmc_cmdframe sdcf;
! 78: uint8_t i;
! 79:
! 80: /* construct frame */
! 81: sdcf = sdmmc_command(cmd, arg, crc);
! 82:
! 83: /* transmit token */
! 84: spi_transmit(ddp->ss_sbhp, sdcf.sc_cmd);
! 85:
! 86: /* transmit 32 bit argument XXX MSB first */
! 87: for(i = 0; i < 4; i++)
! 88: spi_transmit(ddp->ss_sbhp, ((sdcf.sc_arg & (0xff000000 >> i)) >> (8 * (4 - i + 1))) );
! 89:
! 90: /* transmit CRC field */
! 91: spi_transmit(ddp->ss_sbhp, sdcf.sc_cmd)
! 92:
! 93: }
! 94:
! 95:
CVSweb