This is an automated email from the ASF dual-hosted git repository. aguettouche pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 369293dd840127c55061340c76d1fa83233c7818 Author: Pierre-Olivier Vauboin <[email protected]> AuthorDate: Tue Mar 31 17:35:20 2020 +0200 boards/arm/stm32h7/stm32h747i-disco: bring support for SDMMC --- arch/arm/src/stm32h7/hardware/stm32_sdmmc.h | 2 + boards/arm/stm32h7/stm32h747i-disco/src/Makefile | 4 + .../stm32h7/stm32h747i-disco/src/stm32_bringup.c | 10 ++ .../src/{stm32h747i-disco.h => stm32_sdmmc.c} | 185 ++++++++++++--------- .../stm32h747i-disco/src/stm32h747i-disco.h | 25 +++ 5 files changed, 144 insertions(+), 82 deletions(-) diff --git a/arch/arm/src/stm32h7/hardware/stm32_sdmmc.h b/arch/arm/src/stm32h7/hardware/stm32_sdmmc.h index 752b226..5f56274 100644 --- a/arch/arm/src/stm32h7/hardware/stm32_sdmmc.h +++ b/arch/arm/src/stm32h7/hardware/stm32_sdmmc.h @@ -47,6 +47,8 @@ #if defined(CONFIG_STM32H7_STM32H7X3XX) # include "stm32h7x3xx_sdmmc.h" +#elif defined(CONFIG_STM32H7_STM32H7X7XX) +# include "stm32h7x3xx_sdmmc.h" #else # error "Unsupported STM32 H7 part" #endif diff --git a/boards/arm/stm32h7/stm32h747i-disco/src/Makefile b/boards/arm/stm32h7/stm32h747i-disco/src/Makefile index d82ebb1..9518e4f 100644 --- a/boards/arm/stm32h7/stm32h747i-disco/src/Makefile +++ b/boards/arm/stm32h7/stm32h747i-disco/src/Makefile @@ -68,4 +68,8 @@ ifeq ($(CONFIG_LIB_BOARDCTL),y) CSRCS += stm32_appinitialize.c endif +ifeq ($(CONFIG_STM32H7_SDMMC), y) +CSRCS += stm32_sdmmc.c +endif + include $(TOPDIR)/boards/Board.mk diff --git a/boards/arm/stm32h7/stm32h747i-disco/src/stm32_bringup.c b/boards/arm/stm32h7/stm32h747i-disco/src/stm32_bringup.c index 80ae17a..28c1939 100644 --- a/boards/arm/stm32h7/stm32h747i-disco/src/stm32_bringup.c +++ b/boards/arm/stm32h7/stm32h747i-disco/src/stm32_bringup.c @@ -215,5 +215,15 @@ int stm32_bringup(void) } #endif /* CONFIG_ADC */ +#ifdef HAVE_SDIO + /* Initialize the SDIO block driver */ + + ret = stm32_sdio_initialize(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to initialize MMC/SD driver: %d\n", ret); + } +#endif + return OK; } diff --git a/boards/arm/stm32h7/stm32h747i-disco/src/stm32h747i-disco.h b/boards/arm/stm32h7/stm32h747i-disco/src/stm32_sdmmc.c similarity index 51% copy from boards/arm/stm32h7/stm32h747i-disco/src/stm32h747i-disco.h copy to boards/arm/stm32h7/stm32h747i-disco/src/stm32_sdmmc.c index 7bc2e30..6546d69 100644 --- a/boards/arm/stm32h7/stm32h747i-disco/src/stm32h747i-disco.h +++ b/boards/arm/stm32h7/stm32h747i-disco/src/stm32_sdmmc.c @@ -1,9 +1,8 @@ /**************************************************************************** - * boards/arm/stm32h7/stm32h747i-disco/src/stm32h747i-disco.h + * boards/arm/stm32h7/stm32h747i-disco/src/stm32_sdmmc.c * -# Copyright (C) 2017, 2019 Gwenhael Goavec-Merou. All rights reserved. -# Authors: Gwenhael Goavec-Merou<[email protected]> - * David Sidrane <[email protected]> + * Copyright (C) 2016-2019 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <[email protected]> * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -34,17 +33,23 @@ * ****************************************************************************/ -#ifndef __BOARDS_ARM_STM32H7_STM32H747I_DISCO_SRC_STM32H747I_DISCO_H -#define __BOARDS_ARM_STM32H7_STM32H747I_DISCO_SRC_STM32H747I_DISCO_H - /**************************************************************************** * Included Files ****************************************************************************/ #include <nuttx/config.h> -#include <nuttx/compiler.h> -#include <stdint.h> +#include <stdbool.h> +#include <stdio.h> +#include <debug.h> +#include <errno.h> + +#include <nuttx/sdio.h> +#include <nuttx/mmcsd.h> + +#include "stm32_gpio.h" +#include "stm32_sdmmc.h" +#include "stm32h747i-disco.h" /**************************************************************************** * Pre-processor Definitions @@ -52,103 +57,119 @@ /* Configuration ************************************************************/ -/* procfs File System */ +/* Card detections requires card support and a card detection GPIO */ -#ifdef CONFIG_FS_PROCFS -# ifdef CONFIG_NSH_PROC_MOUNTPOINT -# define STM32_PROCFS_MOUNTPOINT CONFIG_NSH_PROC_MOUNTPOINT -# else -# define STM32_PROCFS_MOUNTPOINT "/proc" -# endif +#define HAVE_NCD 1 +#if !defined(HAVE_SDIO) || !defined(GPIO_SDIO_NCD) +# undef HAVE_NCD #endif -/* Check if we can support the RTC driver */ +/**************************************************************************** + * Private Data + ****************************************************************************/ -#define HAVE_RTC_DRIVER 1 -#if !defined(CONFIG_RTC) || !defined(CONFIG_RTC_DRIVER) -# undef HAVE_RTC_DRIVER +static FAR struct sdio_dev_s *g_sdio_dev; +#ifdef HAVE_NCD +static bool g_sd_inserted = 0xff; /* Impossible value */ #endif -/* LED - * - * LD1 Green PI12 - * LD2 Orange PI13 - * LD3 Red PI14 - * LD4 Blue PI15 - */ - -#define GPIO_LD1 (GPIO_OUTPUT | GPIO_PUSHPULL | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | \ - GPIO_PORTI | GPIO_PIN12) -#define GPIO_LD2 (GPIO_OUTPUT | GPIO_PUSHPULL | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | \ - GPIO_PORTI | GPIO_PIN13) -#define GPIO_LD3 (GPIO_OUTPUT | GPIO_PUSHPULL | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | \ - GPIO_PORTI | GPIO_PIN14) -#define GPIO_LD4 (GPIO_OUTPUT | GPIO_PUSHPULL | GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | \ - GPIO_PORTI | GPIO_PIN15) - -#define GPIO_LED_GREEN GPIO_LD1 -#define GPIO_LED_ORANGE GPIO_LD2 -#define GPIO_LED_RED GPIO_LD3 -#define GPIO_LED_BLUE GPIO_LD4 - -#define LED_DRIVER_PATH "/dev/userleds" - -/* BUTTONS - * - * The Blue pushbutton B1, labeled "Wakeup", is connected to GPIO PC13. A - * high value will be sensed when the button is depressed. - * - * Notes: - * 1) That the EXTI is included in the definition to enable an interrupt - * on this IO. - * 2) The following definitions assume the default Solder Bridges are - * installed. - */ - -#define GPIO_BTN_USER (GPIO_INPUT | GPIO_FLOAT | GPIO_EXTI | GPIO_PORTC | GPIO_PIN13) - /**************************************************************************** - * Public Functions + * Private Functions ****************************************************************************/ /**************************************************************************** - * Name: stm32_bringup + * Name: stm32_ncd_interrupt * * Description: - * Perform architecture-specific initialization - * - * CONFIG_BOARD_LATE_INITIALIZE=y : - * Called from board_late_initialize(). - * - * CONFIG_BOARD_LATE_INITIALIZE=y && CONFIG_LIB_BOARDCTL=y : - * Called from the NSH library + * Card detect interrupt handler. * ****************************************************************************/ -int stm32_bringup(void); +#ifdef HAVE_NCD +static int stm32_ncd_interrupt(int irq, FAR void *context, FAR void *param) +{ + bool present; -/**************************************************************************** - * Name: stm32_spidev_initialize - * - * Description: - * Called to configure SPI chip select GPIO pins for the board. - * - ****************************************************************************/ + present = !stm32_gpioread(GPIO_SDIO_NCD); + if (present != g_sd_inserted) + { + sdio_mediachange(g_sdio_dev, present); + g_sd_inserted = present; + } -#ifdef CONFIG_STM32H7_SPI -void stm32_spidev_initialize(void); + return OK; +} #endif /**************************************************************************** - * Name: stm32_adc_setup + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: stm32_sdio_initialize * * Description: - * Initialize ADC and register the ADC driver. + * Initialize SDIO-based MMC/SD card support * ****************************************************************************/ -#ifdef CONFIG_ADC -int stm32_adc_setup(void); +int stm32_sdio_initialize(void) +{ + int ret; + +#ifdef HAVE_NCD + /* Card detect */ + + bool cd_status; + + /* Configure the card detect GPIO */ + + stm32_configgpio(GPIO_SDIO_NCD); + + /* Register an interrupt handler for the card detect pin */ + + (void)stm32_gpiosetevent(GPIO_SDIO_NCD, true, true, true, + stm32_ncd_interrupt, NULL); +#endif + + /* Mount the SDIO-based MMC/SD block driver */ + + /* First, get an instance of the SDIO interface */ + + finfo("Initializing SDIO slot %d\n", SDIO_SLOTNO); + + g_sdio_dev = sdio_initialize(SDIO_SLOTNO); + if (!g_sdio_dev) + { + ferr("ERROR: Failed to initialize SDIO slot %d\n", SDIO_SLOTNO); + return -ENODEV; + } + + /* Now bind the SDIO interface to the MMC/SD driver */ + + finfo("Bind SDIO to the MMC/SD driver, minor=%d\n", SDIO_MINOR); + + ret = mmcsd_slotinitialize(SDIO_MINOR, g_sdio_dev); + if (ret != OK) + { + ferr("ERROR: Failed to bind SDIO to the MMC/SD driver: %d\n", ret); + return ret; + } + + finfo("Successfully bound SDIO to the MMC/SD driver\n"); + +#ifdef HAVE_NCD + /* Use SD card detect pin to check if a card is g_sd_inserted */ + + cd_status = !stm32_gpioread(GPIO_SDIO_NCD); + finfo("Card detect : %d\n", cd_status); + + sdio_mediachange(g_sdio_dev, cd_status); +#else + /* Assume that the SD card is inserted. What choice do we have? */ + + sdio_mediachange(g_sdio_dev, true); #endif -#endif /* __BOARDS_ARM_STM32H7_STM32H747I_DISCO_SRC_STM32H747I_DISCO_H */ + return OK; +} diff --git a/boards/arm/stm32h7/stm32h747i-disco/src/stm32h747i-disco.h b/boards/arm/stm32h7/stm32h747i-disco/src/stm32h747i-disco.h index 7bc2e30..a5c43ad7 100644 --- a/boards/arm/stm32h7/stm32h747i-disco/src/stm32h747i-disco.h +++ b/boards/arm/stm32h7/stm32h747i-disco/src/stm32h747i-disco.h @@ -107,6 +107,19 @@ #define GPIO_BTN_USER (GPIO_INPUT | GPIO_FLOAT | GPIO_EXTI | GPIO_PORTC | GPIO_PIN13) +/* SD/TF Card'detected pin */ + +#if defined(CONFIG_STM32H7_SDMMC1) +# define HAVE_SDIO +#endif + +#if defined(CONFIG_DISABLE_MOUNTPOINT) || !defined(CONFIG_MMCSD_SDIO) +# undef HAVE_SDIO +#endif + +#define SDIO_SLOTNO 0 +#define SDIO_MINOR 0 + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -151,4 +164,16 @@ void stm32_spidev_initialize(void); int stm32_adc_setup(void); #endif +/**************************************************************************** + * Name: stm32_sdio_initialize + * + * Description: + * Initialize SDIO-based MMC/SD card support + * + ****************************************************************************/ + +#ifdef HAVE_SDIO +int stm32_sdio_initialize(void); +#endif + #endif /* __BOARDS_ARM_STM32H7_STM32H747I_DISCO_SRC_STM32H747I_DISCO_H */
