[BACK]Return to sdmmc_spi.c CVS log [TXT][DIR] Up to [local] / funnyos / dev / sdmmc

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