diff --git a/arch/x86/include/i486/irq.h b/arch/x86/include/i486/irq.h index 53b0f7e14df..188e02eaaf0 100644 --- a/arch/x86/include/i486/irq.h +++ b/arch/x86/include/i486/irq.h @@ -108,7 +108,7 @@ #define NR_IRQS 48 -/* Common register save structgure created by up_saveusercontext() and by +/* Common register save structure created by up_saveusercontext() and by * ISR/IRQ interrupt processing. */ diff --git a/configs/nucleo-l432kc/README.txt b/configs/nucleo-l432kc/README.txt index 9010e8bb844..a0f45940a8e 100644 --- a/configs/nucleo-l432kc/README.txt +++ b/configs/nucleo-l432kc/README.txt @@ -52,6 +52,7 @@ Contents - USARTs and Serial Consoles - QFN32 - mbed + - SPI Flash support - Configurations Nucleo-32 Boards @@ -441,6 +442,61 @@ Serial Consoles As shipped, SB62 and SB63 are open and SB13 and SB14 closed, so the virtual COM port is enabled. +SPI Flash support: +===================== + + We can use an external SPI Serial Flash with nucleo-l432kc board. In this + case we tested with AT45DB081D (8Mbit = 1MiB). + + You can connect the AT45DB081D memory in the nucleo-l432kc board this way: + + -------------------------------- + | Memory nucleo-l432kc | + |------------------------------| + | SI ---> D11 (PB5) | + | SCK ---> D13 (PB3) | + | /RESET ---> 3V3 | + | /CS ---> D10 (PA11) | + | /WP ---> 3V3 | + | VCC ---> 3V3 | + | GND ---> GND | + | SO ---> D12 (PB4) | + -------------------------------- + + You can start with default "nucleo-l432kc/nsh" configuration option and + enable/disable these options using "make menuconfig" : + + System Type ---> + STM32L4 Peripheral Support ---> + [*] SPI1 + + Device Drivers ---> + -*- Memory Technology Device (MTD) Support ---> + -*- SPI-based AT45DB flash + (1000000) AT45DB Frequency + + File Systems ---> + [*] NXFFS file system + + + Then after compiling and flashing the file nuttx.bin you can test the flash + this way: + + nsh> ls /mnt + /mnt: + at45db/ + + nsh> echo "Testing" > /mnt/at45db/file.txt + + nsh> ls /mnt/at45db + /mnt/at45db: + file.txt + + nsh> cat /mnt/at45db/file.txt + Testing + + nsh> + Configurations ============== diff --git a/configs/nucleo-l432kc/src/Makefile b/configs/nucleo-l432kc/src/Makefile index e30917d8503..24b91aabf8d 100644 --- a/configs/nucleo-l432kc/src/Makefile +++ b/configs/nucleo-l432kc/src/Makefile @@ -56,6 +56,10 @@ ifeq ($(CONFIG_DAC7571),y) CSRCS += stm32_dac7571.c endif +ifeq ($(CONFIG_MTD_AT45DB),y) +CSRCS += stm32_at45db.c +endif + ifeq ($(CONFIG_SENSORS_QENCODER),y) CSRCS += stm32_qencoder.c endif diff --git a/configs/nucleo-l432kc/src/nucleo-l432kc.h b/configs/nucleo-l432kc/src/nucleo-l432kc.h index e77a79c6e35..aace3e5415d 100644 --- a/configs/nucleo-l432kc/src/nucleo-l432kc.h +++ b/configs/nucleo-l432kc/src/nucleo-l432kc.h @@ -54,6 +54,7 @@ #define HAVE_PROC 1 #define HAVE_RTC_DRIVER 1 +#define HAVE_AT45DB 1 #if !defined(CONFIG_FS_PROCFS) # undef HAVE_PROC @@ -70,6 +71,12 @@ # undef HAVE_RTC_DRIVER #endif +/* Check if we can support AT45DB FLASH file system */ + +#if !defined(CONFIG_STM32L4_SPI1) || !defined(CONFIG_MTD_AT45DB) +# undef HAVE_AT45DB +#endif + /* LED. User LD3: the green LED is a user LED connected to Arduino signal D13 * corresponding to MCU I/O PB3 (pin 26) * target. @@ -83,6 +90,14 @@ GPIO_SPEED_50MHz) #define LED_DRIVER_PATH "/dev/userleds" +/* SPI chip selects */ + +#ifdef CONFIG_MTD_AT45DB +# define AT45DB_SPI1_CS \ + (GPIO_PORTA | GPIO_PIN11 | GPIO_OUTPUT_SET | GPIO_OUTPUT | GPIO_PUSHPULL | \ + GPIO_SPEED_50MHz) +#endif + /************************************************************************************ * Public Data ************************************************************************************/ @@ -156,6 +171,18 @@ int stm32l4_adc_setup(void); int stm32_dac7571initialize(FAR const char *devpath); #endif +/************************************************************************************ + * Name: stm32_at45dbinitialize + * + * Description: + * Initialize and register the AT45DB driver. + * + ************************************************************************************/ + +#ifdef CONFIG_MTD_AT45DB +int stm32_at45dbinitialize(int minor); +#endif + /**************************************************************************** * Name: board_timer_driver_initialize * diff --git a/configs/nucleo-l432kc/src/stm32_appinit.c b/configs/nucleo-l432kc/src/stm32_appinit.c index fe4e274aab3..4bd3351b9e6 100644 --- a/configs/nucleo-l432kc/src/stm32_appinit.c +++ b/configs/nucleo-l432kc/src/stm32_appinit.c @@ -170,6 +170,18 @@ int board_app_initialize(uintptr_t arg) } #endif +#ifdef HAVE_AT45DB + /* Initialize and register the ATDB FLASH file system. */ + + ret = stm32_at45dbinitialize(0); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to initialize AT45DB minor %d: %d\n", + 0, ret); + return ret; + } +#endif + #ifdef CONFIG_PWM /* Initialize PWM and register the PWM device. */ diff --git a/configs/nucleo-l432kc/src/stm32_spi.c b/configs/nucleo-l432kc/src/stm32_spi.c index 7fcf9a38501..77599af8141 100644 --- a/configs/nucleo-l432kc/src/stm32_spi.c +++ b/configs/nucleo-l432kc/src/stm32_spi.c @@ -82,20 +82,39 @@ struct spi_dev_s *g_spi2; void stm32l4_spiinitialize(void) { #ifdef CONFIG_STM32L4_SPI1 + /* Configure SPI1-based devices */ g_spi1 = stm32l4_spibus_initialize(1); - - spiinfo("SPI1 initialized\n"); -#endif - -#ifdef CONFIG_STM32L4_SPI2 - /* Configure SPI-based devices */ - - g_spi2 = stm32l4_spibus_initialize(2); + if (!g_spi1) + { + spierr("ERROR: FAILED to initialize SPI port 1\n"); + } + else + { + spiinfo("INFO: SPI port 1 initialized\n"); + } /* Setup CS, EN & IRQ line IOs */ - spiinfo("SPI2 initialized\n"); +#ifdef CONFIG_MTD_AT45DB + (void)stm32l4_configgpio(AT45DB_SPI1_CS); /* FLASH chip select */ +#endif +#endif + +#ifdef CONFIG_STM32L4_SPI2 + /* Configure SPI2-based devices */ + + g_spi2 = stm32l4_spibus_initialize(2); + if (!g_spi2) + { + spierr("ERROR: FAILED to initialize SPI port 2\n"); + } + else + { + spiinfo("INFO: SPI port 2 initialized\n"); + } + + /* Setup CS, EN & IRQ line IOs */ #endif } @@ -129,6 +148,12 @@ void stm32l4_spi1select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected { spiinfo("devid: %08X CS: %s\n", (int)devid, selected ? "assert" : "de-assert"); +#ifdef CONFIG_MTD_AT45DB + if (devid == SPIDEV_FLASH(0)) + { + stm32l4_gpiowrite(AT45DB_SPI1_CS, !selected); + } +#endif } uint8_t stm32l4_spi1status(FAR struct spi_dev_s *dev, uint32_t devid)