+ SER_STROBE_INIT;
+}
+
+static void spi0_cleanup(UNUSED_ARG(struct SerialHardware *, _hw))
+{
+ /* Disable SPI */
+ SPI0_CR = BV(SPI_SPIDIS);
+
+ /* Disable all irqs */
+ SPI0_IDR = 0xFFFFFFFF;
+
+ SER_SPI0_BUS_TXCLOSE;
+
+ /* Enable PIO on SPI pins */
+ PIOA_PER = BV(SPI0_SPCK) | BV(SPI0_MOSI) | BV(SPI0_MISO);
+}
+
+static void spi0_starttx(struct SerialHardware *_hw)
+{
+ struct ArmSerial *hw = (struct ArmSerial *)_hw;
+
+ cpuflags_t flags;
+ IRQ_SAVE_DISABLE(flags);
+
+ /* Send data only if the SPI is not already transmitting */
+ if (!hw->sending && !fifo_isempty(&ser_spi0->txfifo))
+ {
+ hw->sending = true;
+ SPI0_TDR = fifo_pop(&ser_spi0->txfifo);
+ }
+
+ IRQ_RESTORE(flags);
+}
+
+static void spi0_setbaudrate(UNUSED_ARG(struct SerialHardware *, _hw), unsigned long rate)
+{
+ SPI0_CSR0 &= ~SPI_SCBR;
+
+ ASSERT((uint8_t)DIV_ROUND(CLOCK_FREQ, rate));
+ SPI0_CSR0 |= DIV_ROUND(CLOCK_FREQ, rate) << SPI_SCBR_SHIFT;
+}
+
+/* SPI driver */
+static void spi1_init(UNUSED_ARG(struct SerialHardware *, _hw), UNUSED_ARG(struct Serial *, ser))
+{
+ /* Disable PIO on SPI pins */
+ PIOA_PDR = BV(SPI1_SPCK) | BV(SPI1_MOSI) | BV(SPI1_MISO);
+
+ /* Reset device */
+ SPI1_CR = BV(SPI_SWRST);
+
+/*
+ * Set SPI to master mode, fixed peripheral select, chip select directly connected to a peripheral device,
+ * SPI clock set to MCK, mode fault detection disabled, loopback disable, NPCS0 active, Delay between CS = 0
+ */
+ SPI1_MR = BV(SPI_MSTR) | BV(SPI_MODFDIS);
+
+ /*
+ * Set SPI mode.
+ * At reset clock division factor is set to 0, that is
+ * *forbidden*. Set SPI clock to minimum to keep it valid.
+ */
+ SPI1_CSR0 = BV(SPI_NCPHA) | (255 << SPI_SCBR_SHIFT);
+
+ /* Disable all irqs */
+ SPI1_IDR = 0xFFFFFFFF;
+ /* Set the vector. */
+ AIC_SVR(SPI1_ID) = spi1_irq_handler;
+ /* Initialize to edge triggered with defined priority. */
+ AIC_SMR(SPI1_ID) = AIC_SRCTYPE_INT_EDGE_TRIGGERED | SERIRQ_PRIORITY;
+ /* Enable the USART IRQ */
+ AIC_IECR = BV(SPI1_ID);
+ PMC_PCER = BV(SPI1_ID);
+
+ /* Enable interrupt on tx buffer empty */
+ SPI1_IER = BV(SPI_TXEMPTY);
+
+ /* Enable SPI */
+ SPI1_CR = BV(SPI_SPIEN);
+
+
+ SER_SPI1_BUS_TXINIT;