static void
mpcsa_spi_attach(device_t parent, device_t self, void *aux)
{
	struct mpcsa_spi_softc *sc = device_private(self);

	// do some checks
	if ((sc->sc_pioa = at91pio_sc(AT91_PIOA)) == NULL) {
		printf("no PIOA!\n");
		return;
	}
	if ((sc->sc_piod = at91pio_sc(AT91_PIOD)) == NULL) {
		printf("no PIOD!\n");
		return;
	}

	// initialize softc
	sc->sc_at91spi.sc_spi.sct_nslaves = 3;	// number of slaves

	// configure GPIO
	GPIO_SPICS0(at91pio_out); GPIO_SPICS0(at91pio_set);
	GPIO_SPICS1(at91pio_out); GPIO_SPICS1(at91pio_set);
	GPIO_SPICS2(at91pio_out); GPIO_SPICS2(at91pio_set);

	// and call common routine
	at91spi_attach_common(parent, self, aux, &mpcsa_spi_tag);
}
Exemplo n.º 2
0
static void
mpcsa_usart_attach(struct device *parent, struct device *self, void *aux)
{
	struct mpcsa_usart_softc *sc = (struct mpcsa_usart_softc *)self;
	struct at91bus_attach_args *sa = aux;

	// initialize softc
	if ((sc->sc_pioa = at91pio_sc(AT91_PIOA)) == NULL) {
		printf("no PIOA!\n");
		return;
	}
	if ((sc->sc_piob = at91pio_sc(AT91_PIOB)) == NULL) {
		printf("no PIOB!\n");
		return;
	}
	if ((sc->sc_piod = at91pio_sc(AT91_PIOD)) == NULL) {
		printf("no PIOD!\n");
		return;
	}

	// calculate unit number...
	switch (sa->sa_pid) {
	case PID_US0:
	case PID_US1:
	case PID_US2:
	case PID_US3:
		sc->sc_dev.enable = mpcsa_usart_enable;
		sc->sc_dev.disable = mpcsa_usart_disable;
		sc->sc_dev.hwflow = mpcsa_usart_hwflow;
		sc->sc_dev.start_tx = mpcsa_usart_start_tx;
		sc->sc_dev.stop_tx = mpcsa_usart_stop_tx;
		sc->sc_dev.rx_started = mpcsa_usart_rx_started;
		sc->sc_dev.rx_stopped = mpcsa_usart_rx_stopped;
		sc->sc_dev.rx_rts_ctl = mpcsa_usart_rx_rts_ctl;
		break;
	}

	/* configure pins */
	switch (sa->sa_pid) {
	case PID_US0:
		at91pio_set(sc->sc_piob, PB_RTS1);
		at91pio_set(sc->sc_piod, PD_DTR1);
		at91pio_in(sc->sc_piob, PB_CTS1);
		at91pio_out(sc->sc_piob, PB_RTS1);
		at91pio_in(sc->sc_piod, PD_DSR1);
		at91pio_out(sc->sc_piod, PD_DTR1);
		at91pio_per(sc->sc_piob, PB_CTS1, -1);
		at91pio_per(sc->sc_piob, PB_RTS1, -1);
		at91pio_per(sc->sc_piod, PD_DSR1, -1);
		at91pio_per(sc->sc_piod, PD_DTR1, -1);
		break;
	case PID_US1:
		at91pio_set(sc->sc_piob, PB_RTS2);
		at91pio_set(sc->sc_piod, PD_DTR2);
		at91pio_in(sc->sc_piob, PB_CTS2);
		at91pio_out(sc->sc_piob, PB_RTS2);
		at91pio_in(sc->sc_piod, PD_DSR2);
		at91pio_out(sc->sc_piod, PD_DTR2);
		at91pio_per(sc->sc_piob, PB_CTS2, -1);
		at91pio_per(sc->sc_piob, PB_RTS2, -1);
		at91pio_per(sc->sc_piod, PD_DSR2, -1);
		at91pio_per(sc->sc_piod, PD_DTR2, -1);
		break;
	case PID_US2:
		at91pio_set(sc->sc_piob, PB_RTS3);
		at91pio_set(sc->sc_piod, PD_DTR3);
		at91pio_in(sc->sc_piob, PB_CTS3);
		at91pio_out(sc->sc_piob, PB_RTS3);
		at91pio_in(sc->sc_piod, PD_DSR3);
		at91pio_out(sc->sc_piod, PD_DTR3);
		at91pio_per(sc->sc_piob, PB_CTS3, -1);
		at91pio_per(sc->sc_piob, PB_RTS3, -1);
		at91pio_per(sc->sc_piod, PD_DSR3, -1);
		at91pio_per(sc->sc_piod, PD_DTR3, -1);
		break;
	case PID_US3:
		/* configure pin states... */
		at91pio_clear(sc->sc_pioa, PA_GSMON);
		at91pio_set(sc->sc_pioa, PA_GSMOFF);
		at91pio_set(sc->sc_piob, PB_RTS4);
		at91pio_set(sc->sc_piod, PD_DTR4);

		/* configure pin directions.. */
		at91pio_out(sc->sc_pioa, PA_GSMOFF);
		at91pio_out(sc->sc_pioa, PA_GSMON);
		at91pio_in(sc->sc_pioa, PA_TXD4);
		at91pio_in(sc->sc_piob, PB_RTS4);
		at91pio_in(sc->sc_piob, PB_CTS4);
		at91pio_in(sc->sc_piod, PD_DTR4);
		at91pio_in(sc->sc_piod, PD_DSR4);
		at91pio_in(sc->sc_piod, PD_DCD4);

		/* make sure all related pins are configured as PIO */
		at91pio_per(sc->sc_pioa, PA_GSMOFF, -1);
		at91pio_per(sc->sc_pioa, PA_GSMON, -1);
		at91pio_per(sc->sc_pioa, PA_TXD4, -1);
		at91pio_per(sc->sc_piob, PB_CTS4, -1);
		at91pio_per(sc->sc_piob, PB_RTS4, -1);
		at91pio_per(sc->sc_piod, PD_DSR4, -1);
		at91pio_per(sc->sc_piod, PD_DTR4, -1);
		at91pio_per(sc->sc_piod, PD_DCD4, -1);
		break;
	}

	// and call common routine
	at91usart_attach_subr(&sc->sc_dev, sa);
}