Exemple #1
0
/// 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
}
Exemple #2
0
_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);
}