From cf8268f7d8ae3bb250e72fe05f13ab51762a4a30 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Wed, 5 Jun 2019 08:20:00 -0600 Subject: [PATCH] configs/makerlisp/src/ez80_lowinit.c: Remove redundant SPI GPIO setup. This is already done in the SPI driver. configs/makerlisp/src/ez80_spi.c: Add hooks needed by SPI driver. Move SPI MMC/SD chip selected configuration from ez80_lowinit.c to here as it done in other NuttX architectures. This enables support for multiple devices on the SPI bus. --- arch/z80/src/ez80/ez80f91_spi.h | 22 ++-- configs/makerlisp/src/Makefile | 3 +- configs/makerlisp/src/ez80_lowinit.c | 32 +---- configs/makerlisp/src/ez80_spi.c | 167 ++++++++++++++++++++++++++ configs/makerlisp/src/ez80_spimmcsd.c | 22 +--- configs/makerlisp/src/makerlisp.h | 12 ++ 6 files changed, 202 insertions(+), 56 deletions(-) create mode 100644 configs/makerlisp/src/ez80_spi.c diff --git a/arch/z80/src/ez80/ez80f91_spi.h b/arch/z80/src/ez80/ez80f91_spi.h index 31aca65502..3a860c4a6b 100644 --- a/arch/z80/src/ez80/ez80f91_spi.h +++ b/arch/z80/src/ez80/ez80f91_spi.h @@ -99,7 +99,7 @@ extern "C" * Public Functions ************************************************************************************/ -/**************************************************************************** +/************************************************************************************ * Name: ez80_spibus_initialize * * Description: @@ -119,24 +119,24 @@ extern "C" * Returned Value: * Valid SPI device structre reference on succcess; a NULL on failure * - ****************************************************************************/ + ************************************************************************************/ FAR struct spi_dev_s *ez80_spibus_initialize(int port); /************************************************************************************ - * The external functions, ez80_spiselect, ez80_spistatus, ans ez80_spicmddata must + * The external functions, ez80_spiselect, ez80_spistatus, and ez80_spicmddata must * be provided by board-specific logic. These are implementations of the select, * status, and cmddata methods of the SPI interface defined by struct spi_ops_s (see - * include/nuttx/spi/spi.h). All other methods (including ez80_spibus_initialize()) are - * provided by common logic. To use this common SPI logic on your board: + * include/nuttx/spi/spi.h). All other methods (including ez80_spibus_initialize()) + * are provided by common logic. To use this common SPI logic on your board: * - * 1. Provide ez80_spiselect() and ez80_spistatus() functions in your board-specific - * logic. This function will perform chip selection and status operations using - * GPIOs in the way your board is configured. + * 1. Provide ez80_spiselect() and ez80_spistatus() 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. If CONFIG_SPI_CMDDATA is defined in your NuttX configuration, provide the - * ez80_spiscmddata() function in your board-specific logic. This function will - * perform cmd/data selection operations using GPIOs in the way your board is - * configured. + * ez80_spiscmddata() function in your board-specific logic. This function + * will perform cmd/data selection operations using GPIOs in the way your board + * is configured. * 3. Add a call to ez80_spibus_initialize() in your low level initialization logic * 4. The handle returned by ez80_spibus_initialize() may then be used to bind the * SPI driver to higher level logic (e.g., calling mmcsd_spislotinitialize(), diff --git a/configs/makerlisp/src/Makefile b/configs/makerlisp/src/Makefile index f14a81b141..4f9ec28711 100644 --- a/configs/makerlisp/src/Makefile +++ b/configs/makerlisp/src/Makefile @@ -46,8 +46,9 @@ ifeq ($(CONFIG_ARCH_LEDS),y) CSRCS += ez80_leds.c endif -ifeq ($(CONFIG_MMCSD_SPI),y) ifeq ($(CONFIG_EZ80_SPI),y) +CSRCS += ez80_spi.c +ifeq ($(CONFIG_MMCSD_SPI),y) CSRCS += ez80_spimmcsd.c endif endif diff --git a/configs/makerlisp/src/ez80_lowinit.c b/configs/makerlisp/src/ez80_lowinit.c index 63f1878905..922d286904 100644 --- a/configs/makerlisp/src/ez80_lowinit.c +++ b/configs/makerlisp/src/ez80_lowinit.c @@ -157,35 +157,13 @@ void ez80_lowinit(void) regval &= ~EZ80_GPIOD5; outp(EZ80_PB_DDR, regval); - /* Set port B pins 7 (MOSI), 6 (MISO), 3 (SCK), 2 (/SS) to SPI */ +#ifdef CONFIG_EZ80_SPI + /* Initialize SPI chip selects */ - regval = inp(EZ80_PB_ALT1); - regval &= ~(EZ80_GPIOD2 | EZ80_GPIOD3 | EZ80_GPIOD6 | EZ80_GPIOD7); - outp(EZ80_PB_ALT1, regval); + ez80_spidev_initialize(); +#endif - regval = inp(EZ80_PB_ALT2); - regval &= ~(EZ80_GPIOD2 | EZ80_GPIOD3 | EZ80_GPIOD6 | EZ80_GPIOD7); - outp(EZ80_PB_ALT2, regval); - - /* Set port B pin 4 as output, high - use for /CS */ - - regval = inp(EZ80_PB_DR); - regval |= EZ80_GPIOD4; - outp(EZ80_PB_DR, regval); - - regval = inp(EZ80_PB_ALT1); - regval &= ~EZ80_GPIOD4; - outp(EZ80_PB_ALT1, regval); - - regval = inp(EZ80_PB_ALT2); - regval &= ~EZ80_GPIOD4; - outp(EZ80_PB_ALT2, regval); - - regval = inp(EZ80_PB_DDR); - regval &= ~EZ80_GPIOD4; - outp(EZ80_PB_DDR, regval); - - /* Leave /sysreset asserted for a while */ + /* Leave /sysreset asserted for awhile longer */ up_udelay(150); diff --git a/configs/makerlisp/src/ez80_spi.c b/configs/makerlisp/src/ez80_spi.c new file mode 100644 index 0000000000..584efe62b3 --- /dev/null +++ b/configs/makerlisp/src/ez80_spi.c @@ -0,0 +1,167 @@ +/***************************************************************************** + * configs/makerlisp/src/ez80_spi.c + * + * Copyright (C) 2019 Greg Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ****************************************************************************/ + +/***************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include + +#include "chip.h" +#include "up_internal.h" +#include "ez80f91_spi.h" +#include "makerlisp.h" + +/***************************************************************************** + * Private Functions + ****************************************************************************/ + +/* NOTE: We are using a SDCard adapter/module without Card Detect pin! + * Then we don't need to Card Detect callback here. + */ + +/***************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: ez80_spidev_initialize + * + * Description: + * Called to configure SPI chip select GPIO pins for the MakerLisp board. + * + ****************************************************************************/ + +int ez80_mmcsd_initialize(void) +{ +#ifdef HAVE_MMCSD + uint8_t regval; + + /* MMC/SD CS: Port B pin 4 as output */ + + regval = inp(EZ80_PB_DR); + regval |= EZ80_GPIOD4; + outp(EZ80_PB_DR, regval); + + regval = inp(EZ80_PB_ALT1); + regval &= ~EZ80_GPIOD4; + outp(EZ80_PB_ALT1, regval); + + regval = inp(EZ80_PB_ALT2); + regval &= ~EZ80_GPIOD4; + outp(EZ80_PB_ALT2, regval); + + regval = inp(EZ80_PB_DDR); + regval &= ~EZ80_GPIOD4; + outp(EZ80_PB_DDR, regval); +#endif +} + +/***************************************************************************** + * The external functions, ez80_spiselect, ez80_spistatus, and + * ez80_spicmddata must be provided by board-specific logic. These are + * implementations of the select, status, and cmddata methods of the SPI + * interface defined by struct spi_ops_s (see include/nuttx/spi/spi.h). All + * other methods (including ez80_spibus_initialize()) are provided by common + * logic. To use this common SPI logic on your board: + * + * 1. Provide ez80_spiselect() and ez80_spistatus() 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. If CONFIG_SPI_CMDDATA is defined in your NuttX configuration, provide + * the ez80_spiscmddata() function in your board-specific logic. This + * function will perform cmd/data selection operations using GPIOs in + * the way your board is configured. + * 3. Add a call to ez80_spibus_initialize() in your low level + * initialization logic + * 4. The handle returned by ez80_spibus_initialize() 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). + * + ****************************************************************************/ + +void ez80_spiselect(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) +{ +#ifdef HAVE_MMCSD + if (devid == SPIDEV_MMCSD(0)) + { + uint8_t regval; + + /* Set port B pin 4 output */ + + regval = inp(EZ80_PB_DR); + + if (selected) + { + regval &= ~EZ80_GPIOD4; + } + else + { + regval |= EZ80_GPIOD4; + } + + outp(EZ80_PB_DR, regval); + } +#endif +} + +uint8_t ez80_spistatus(FAR struct spi_dev_s *dev, uint32_t devid) +{ + uint8_t status = 0; + +#ifdef HAVE_MMCSD_SPI + if (devid == SPIDEV_MMCSD(0)) + { + /* No card detect pin.. Always claim that the card is present in + * slot 0 + */ + + status |= SPI_STATUS_PRESENT; + } +#endif + + return status; +} + +int ez80_spicmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd) +{ + return -ENODEV; +} + +#endif /* HAVE_MMCSD */ diff --git a/configs/makerlisp/src/ez80_spimmcsd.c b/configs/makerlisp/src/ez80_spimmcsd.c index dff41eb84f..1e0ee02bf3 100644 --- a/configs/makerlisp/src/ez80_spimmcsd.c +++ b/configs/makerlisp/src/ez80_spimmcsd.c @@ -58,29 +58,17 @@ * Private Functions ****************************************************************************/ -/* NOTE: We are using a SDCard adapter/module without Card Detect pin! - * Then we don't need to Card Detect callback here. +/* NOTES: + * + * 1. We are using a SDCard adapter/module without Card Detect pin! + * Then we don't need to Card Detect callback here. + * 2. Media Change callbacks are not yet implemented in the SPI driver. */ /***************************************************************************** * Public Functions ****************************************************************************/ -/***************************************************************************** - * Name: ez80_spi1register - * - * Description: - * Registers media change callback - * - ****************************************************************************/ - -int ez80_spi1register(struct spi_dev_s *dev, spi_mediachange_t callback, - void *arg) -{ - spiinfo("INFO: Registering spi1 device\n"); - return OK; -} - /***************************************************************************** * Name: ez80_mmcsd_initialize * diff --git a/configs/makerlisp/src/makerlisp.h b/configs/makerlisp/src/makerlisp.h index 5d0d504c44..d666a71d87 100644 --- a/configs/makerlisp/src/makerlisp.h +++ b/configs/makerlisp/src/makerlisp.h @@ -157,6 +157,18 @@ int ez80_bringup(void); int ez80_mmcsd_initialize(void); #endif +/**************************************************************************** + * Name: ez80_spidev_initialize + * + * Description: + * Called to configure SPI chip select GPIO pins for the MakerLisp board. + * + ****************************************************************************/ + +#ifdef CONFIG_EZ80_SPI +void ez80_spidev_initialize(void); +#endif + #undef EXTERN #if defined(__cplusplus) }