/// Init and test SPIFI in command mode void spiflash_init() { spifi_pinmux(); spifi_reset(); volatile uint32_t cfi = spiflash_cfi(); while(cfi != 0x010219); // Assert CFI chip ID is as expected }
_ramfunc void spiflash_enter_cmd_mode() { __disable_irq(); SCnSCB->ACTLR &= ~2; spifi_reset(); }
void spifi_attach(device_t parent, device_t self, void *aux) { struct spifi_softc *sc = device_private(self); struct apbus_attach_args *apa = aux; struct dmac3_softc *dma; int intr, i; sc->sc_dev = self; /* Initialize scbs. */ TAILQ_INIT(&sc->free_scb); TAILQ_INIT(&sc->ready_scb); for (i = 0; i < __arraycount(sc->sc_scb); i++) TAILQ_INSERT_TAIL(&sc->free_scb, &sc->sc_scb[i], chain); sc->sc_reg = (struct spifi_reg *)apa->apa_hwbase; sc->sc_id = 7; /* XXX */ /* Find my dmac3. */ dma = dmac3_link(apa->apa_ctlnum); if (dma == NULL) { aprint_error(": cannot find slave dmac\n"); return; } sc->sc_dma = dma; aprint_normal(" slot%d addr 0x%lx", apa->apa_slotno, apa->apa_hwbase); aprint_normal(": SCSI ID = %d, using %s\n", sc->sc_id, device_xname(dma->sc_dev)); dmac3_reset(sc->sc_dma); DMAC3_SLOWACCESS(sc); spifi_reset(sc); DMAC3_FASTACCESS(sc); sc->sc_adapter.adapt_dev = self; sc->sc_adapter.adapt_nchannels = 1; sc->sc_adapter.adapt_openings = 7; sc->sc_adapter.adapt_max_periph = 1; sc->sc_adapter.adapt_ioctl = NULL; sc->sc_adapter.adapt_minphys = minphys; sc->sc_adapter.adapt_request = spifi_scsipi_request; memset(&sc->sc_channel, 0, sizeof(sc->sc_channel)); sc->sc_channel.chan_adapter = &sc->sc_adapter; sc->sc_channel.chan_bustype = &scsi_bustype; sc->sc_channel.chan_channel = 0; sc->sc_channel.chan_ntargets = 8; sc->sc_channel.chan_nluns = 8; sc->sc_channel.chan_id = sc->sc_id; if (apa->apa_slotno == 0) intr = NEWS5000_INT0_DMAC; else intr = SLOTTOMASK(apa->apa_slotno); apbus_intr_establish(0, intr, 0, spifi_intr, sc, apa->apa_name, apa->apa_ctlnum); config_found(self, &sc->sc_channel, scsiprint); }