first cut at turnon scripts for EasyTimer v2
[fw/altos] / src / lpc / ao_spi_lpc.c
index f091c89c570963542f602c0e7f6d8957116895d4..010feb63ec3ebc5e2c4c74b165e20dc38a83ad50 100644 (file)
@@ -3,7 +3,8 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -29,7 +30,7 @@ static struct lpc_ssp * const ao_lpc_ssp[LPC_NUM_SPI] = { &lpc_ssp0, &lpc_ssp1 }
                        while ((lpc_ssp->sr & (1 << LPC_SSP_SR_RNE)) == 0) \
                                ;                                       \
                        /* receive a byte */                            \
-                       get lpc_ssp->dr;                                \
+                       get (uint8_t) lpc_ssp->dr;                      \
                }                                                       \
                /* Wait for the SSP to go idle (it already should be) */ \
                while (lpc_ssp->sr & (1 << LPC_SSP_SR_BSY));            \
@@ -89,7 +90,7 @@ ao_spi_put(uint8_t id)
 }
 
 static void
-ao_spi_channel_init(uint8_t id)
+ao_spi_channel_init(uint8_t id, uint8_t mode)
 {
        struct lpc_ssp  *lpc_ssp = ao_lpc_ssp[id];
        uint8_t d;
@@ -101,8 +102,7 @@ ao_spi_channel_init(uint8_t id)
 
        lpc_ssp->cr0 = ((LPC_SSP_CR0_DSS_8 << LPC_SSP_CR0_DSS) |
                        (LPC_SSP_CR0_FRF_SPI << LPC_SSP_CR0_FRF) |
-                       (0 << LPC_SSP_CR0_CPOL) |
-                       (0 << LPC_SSP_CR0_CPHA) |
+                       mode |
                        (0 << LPC_SSP_CR0_SCR));
 
        /* Enable the device */
@@ -120,6 +120,9 @@ void
 ao_spi_init(void)
 {
 #if HAS_SPI_0
+#ifndef SPI_0_MODE
+#define SPI_0_MODE     0
+#endif
        /* Configure pins */
 #if SPI_SCK0_P0_6
        lpc_ioconf.pio0_6 = ao_lpc_alternate(LPC_IOCONF_FUNC_PIO0_6_SCK0);
@@ -146,12 +149,15 @@ ao_spi_init(void)
        lpc_scb.ssp0clkdiv = 1;
 
        /* Reset the device */
-       lpc_scb.presetctrl &= ~(1 << LPC_SCB_PRESETCTRL_SSP0_RST_N);
+       lpc_scb.presetctrl &= ~(1UL << LPC_SCB_PRESETCTRL_SSP0_RST_N);
        lpc_scb.presetctrl |= (1 << LPC_SCB_PRESETCTRL_SSP0_RST_N);
-       ao_spi_channel_init(0);
+       ao_spi_channel_init(0, SPI_0_MODE);
 #endif
 
 #if HAS_SPI_1
+#ifndef SPI_1_MODE
+#define SPI_1_MODE     0
+#endif
 
 #if SPI_SCK1_P1_15
        lpc_ioconf.pio1_15 = ao_lpc_alternate(LPC_IOCONF_FUNC_PIO1_15_SCK1);
@@ -196,8 +202,8 @@ ao_spi_init(void)
        lpc_scb.ssp1clkdiv = 1;
 
        /* Reset the device */
-       lpc_scb.presetctrl &= ~(1 << LPC_SCB_PRESETCTRL_SSP1_RST_N);
+       lpc_scb.presetctrl &= ~(1UL << LPC_SCB_PRESETCTRL_SSP1_RST_N);
        lpc_scb.presetctrl |= (1 << LPC_SCB_PRESETCTRL_SSP1_RST_N);
-       ao_spi_channel_init(1);
+       ao_spi_channel_init(1, SPI_1_MODE);
 #endif /* HAS_SPI_1 */
 }