summaryrefslogtreecommitdiff
path: root/nuttx/configs/stm3210e-eval
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2009-10-15 23:16:14 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2009-10-15 23:16:14 +0000
commit9328ea4048154b6e2392e0102cbbb33712fa0fe6 (patch)
tree47e4c87128d5218aa0d61bdb6d1bb7a34f12f250 /nuttx/configs/stm3210e-eval
parentc0b9d8a745841fb1d713a63182230b491369f219 (diff)
downloadpx4-nuttx-9328ea4048154b6e2392e0102cbbb33712fa0fe6.tar.gz
px4-nuttx-9328ea4048154b6e2392e0102cbbb33712fa0fe6.tar.bz2
px4-nuttx-9328ea4048154b6e2392e0102cbbb33712fa0fe6.zip
Fix SPI compilation errors
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2139 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/configs/stm3210e-eval')
-rwxr-xr-xnuttx/configs/stm3210e-eval/src/up_spi.c123
1 files changed, 77 insertions, 46 deletions
diff --git a/nuttx/configs/stm3210e-eval/src/up_spi.c b/nuttx/configs/stm3210e-eval/src/up_spi.c
index 058d43a29..bfad4c5ae 100755
--- a/nuttx/configs/stm3210e-eval/src/up_spi.c
+++ b/nuttx/configs/stm3210e-eval/src/up_spi.c
@@ -79,6 +79,36 @@
* Private Functions
************************************************************************************/
+static void stm32_chipselect(FAR struct spi_dev_s *dev, uint32 pinset, boolean pinval, boolean selected)
+{
+ spidbg("devid: %d CS: %s pinset: %08x pinval: %s\n",
+ (int)devid, selected ? "assert" : "de-assert", pinset, pinval ? "HIGH" : "LOW");
+
+ /* If we are selecting the chip, then we must call stm32_spitake to assure that we
+ * have mutually exclusive access to the SPI bus while the chip is selected.
+ */
+
+ if (selected)
+ {
+ stm32_spitake(dev);
+ }
+
+ /* Then set the CHIP select. Usually the chip select is LOW to select and HIGH, but
+ * that can vary from part to part.
+ */
+
+ stm32_gpiowrite(pinset, pinval);
+
+ /* If we just de-selected the chip, then we must call stm32_spigive to to relinquish
+ * our exclusive access to the SPI bus. Now, any waiting threads can have the SPI.
+ */
+
+ if (!selected)
+ {
+ stm32_spigive(dev);
+ }
+}
+
/************************************************************************************
* Public Functions
************************************************************************************/
@@ -93,76 +123,65 @@
void weak_function stm32_spiinitialize(void)
{
- /* NOTE: Clocking for SPI1 and/or SPI2 was already provided in stm32_rcc.c */
+ /* NOTE: Clocking for SPI1 and/or SPI2 was already provided in stm32_rcc.c.
+ * Configurations of SPI pins is performed in stm32_spi.c.
+ * Here, we only initialize chip select pins unique to the board
+ * architecture.
+ */
#ifdef CONFIG_STM32_SPI1
- /* Select SPI1 pin mapping */
-
- uint32 mapr = getreg32(STM32_AFIO_MAPR);
-#ifdef CONFIG_STM32_SPI1_REMAP
- mapr |= AFIO_MAPR_SPI1_REMAP;
-#else
- mapr &= ~AFIO_MAPR_SPI1_REMAP;
-#endif
- putreg32(mapr, STM32_AFIO_MAPR);
-
- /* Configure SPI1 alternate function pins */
-
- stm32_configgpio(GPIO_SPI1_SCK);
- stm32_configgpio(GPIO_SPI1_MISO);
- stm32_configgpio(GPIO_SPI1_MOSI);
-
/* Configure the SPI-based microSD and FLASH CS GPIO */
stm32_configgpio(GPIO_MMCSD_CS);
stm32_configgpio(GPIO_FLASH_CS);
#endif
-
-#ifdef CONFIG_STM32_SPI2
- /* Configure SPI1 alternate function pins */
-
- stm32_configgpio(GPIO_SPI2_SCK);
- stm32_configgpio(GPIO_SPI2_MISO);
- stm32_configgpio(GPIO_SPI2_MOSI);
-
-#endif
}
/****************************************************************************
- * The external functions, stm32_spi1/2select and stm32_spi1/2status must be
- * provided by board-specific logic. These are implementations of the
- * select and status methods SPI interface defined by struct spi_ops_s (see
- * include/nuttx/spi.h). All other methods (including up_spiinitialize())
- * are provided by common logic. To use this common SPI logic on your board:
- *
- * 1. Provide stm32_spi1/2select() and stm32_spi1/2status() functions in your
- * board-specific logic. This function will perform chip selection and
- * status operations using GPIOs in the way your board is configured.
- * 2. Add a call to up_spiinitialize() in your low level initialization
- * logic
- * 3. The handle returned by up_spiinitialize() may then be used to bind the
- * SPI driver to higher level logic (e.g., calling
- * mmcsd_spislotinitialize(), for example, will bind the SPI driver to
- * the SPI MMC/SD driver).
- *
+ * Name: stm32_spi1/2/3select and stm32_spi1/2/3status
+ *
+ * Description:
+ * The external functions, stm32_spi1/2/3select and stm32_spi1/2/3status must be
+ * provided by board-specific logic. They are implementations of the select
+ * and status methods of the SPI interface defined by struct spi_ops_s (see
+ * include/nuttx/spi.h). All other methods (including up_spiinitialize())
+ * are provided by common STM32 logic. To use this common SPI logic on your
+ * board:
+ *
+ * 1. Provide logic in stm32_boardinitialize() to configure SPI chip select
+ * pins.
+ * 2. Provide stm32_spi1/2/3select() and stm32_spi1/2/3status() functions in your
+ * board-specific logic. These functions will perform chip selection and
+ * status operations using GPIOs in the way your board is configured.
+ * The select() methods must call stm32_spitake() when the chip is selected
+ * and stm32_spigive() when the chip is deselected. This assures mutually
+ * exclusive access to the SPI for the duration while a chip is selected.
+ * 3. Add a calls to up_spiinitialize() in your low level application
+ * initialization logic
+ * 4. The handle returned by up_spiinitialize() may then be used to bind the
+ * SPI driver to higher level logic (e.g., calling
+ * mmcsd_spislotinitialize(), for example, will bind the SPI driver to
+ * the SPI MMC/SD driver).
+ *
****************************************************************************/
#ifdef CONFIG_STM32_SPI1
void stm32_spi1select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, boolean selected)
{
- spidbg("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert");
+ spidbg("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert");
+ uint32 pinset;
if (devid == SPIDEV_MMCSD)
{
/* Set the GPIO low to select and high to de-select */
-
- stm32_gpiowrite(GPIO_MMCSD_CS, !selected);
+
+ stm32_chipselect(dev, GPIO_MMCSD_CS,!selected, selected);
}
else if (devid == SPIDEV_FLASH)
{
/* Set the GPIO low to select and high to de-select */
- stm32_gpiowrite(GPIO_FLASH_CS, !selected);
+ stm32_chipselect(dev, GPIO_FLASH_CS,!selected, selected);
}
}
@@ -184,4 +203,16 @@ ubyte stm32_spi2status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
}
#endif
+#ifdef CONFIG_STM32_SPI3
+void stm32_spi3select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, boolean selected)
+{
+ spidbg("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert");
+}
+
+ubyte stm32_spi3status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
+{
+ return SPI_STATUS_PRESENT;
+}
+#endif
+
#endif /* CONFIG_STM32_SPI1 || CONFIG_STM32_SPI2 */