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); }
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); }