diff --git a/Documentation/NuttxPortingGuide.html b/Documentation/NuttxPortingGuide.html
index f1007f49926..473015684ac 100644
--- a/Documentation/NuttxPortingGuide.html
+++ b/Documentation/NuttxPortingGuide.html
@@ -5376,7 +5376,8 @@ int kbd_decode(FAR struct lib_instream_s *stream, FAR struct kbd_getstate_s *sta
void (*reset)(FAR struct sdio_dev_s *dev);
- uint8_t (*status)(FAR struct sdio_dev_s *dev);
+ sdio_capset_t (*capabilities)(FAR struct sdio_dev_s *dev);
+ sdio_statset_t (*status)(FAR struct sdio_dev_s *dev);
void (*widebus)(FAR struct sdio_dev_s *dev, bool enable);
void (*clock)(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate);
int (*attach)(FAR struct sdio_dev_s *dev);
diff --git a/arch/arm/src/kinetis/Kconfig b/arch/arm/src/kinetis/Kconfig
index 980905f18a2..059bee2008a 100644
--- a/arch/arm/src/kinetis/Kconfig
+++ b/arch/arm/src/kinetis/Kconfig
@@ -658,6 +658,12 @@ endmenu # Kinetis Ethernet Configuration
menu "Kinetis SDHC Configuration"
depends on KINETIS_SDHC
+config KINETIS_SDHC_WIDTH_D1_ONLY
+ bool "Use D1 only"
+ default n
+ ---help---
+ Select 1-bit transfer mode. Default: 4-bit transfer mode.
+
config KINETIS_SDHC_ABSFREQ
bool "Custom transfer frequencies"
default n
@@ -687,14 +693,14 @@ config KINETIS_MMCXFR_FREQ
config KINETIS_SD1BIT_FREQ
int "SD 1-bit transfer frequency"
default 20000000
- depends on SDIO_WIDTH_D1_ONLY
+ depends on KINETIS_SDHC_WIDTH_D1_ONLY
---help---
Frequency to use for transferring data to/from an SD card using on a single data liune.
config KINETIS_SD4BIT_FREQ
int "SD 4-bit transfer frequency"
default 20000000
- depends on !SDIO_WIDTH_D1_ONLY
+ depends on !KINETIS_SDHC_WIDTH_D1_ONLY
---help---
Frequency to use for transferring data to/from an SD card using all four data lines.
diff --git a/arch/arm/src/kinetis/kinetis_sdhc.c b/arch/arm/src/kinetis/kinetis_sdhc.c
index b724bfec917..3d6de8f9077 100644
--- a/arch/arm/src/kinetis/kinetis_sdhc.c
+++ b/arch/arm/src/kinetis/kinetis_sdhc.c
@@ -1,7 +1,7 @@
/****************************************************************************
* arch/arm/src/kinetis/kinetis_sdhc.c
*
- * Copyright (C) 2011-2012, 2014, 2016 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2011-2012, 2014, 2016-2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt
*
* Redistribution and use in source and binary forms, with or without
@@ -173,7 +173,7 @@ struct kinetis_dev_s
/* Callback support */
- uint8_t cdstatus; /* Card status */
+ sdio_statset_t cdstatus; /* Card status */
sdio_eventset_t cbevents; /* Set of events to be cause callbacks */
worker_t callback; /* Registered callback function */
void *cbarg; /* Registered callback argument */
@@ -282,7 +282,8 @@ static int kinetis_lock(FAR struct sdio_dev_s *dev, bool lock);
/* Initialization/setup */
static void kinetis_reset(FAR struct sdio_dev_s *dev);
-static uint8_t kinetis_status(FAR struct sdio_dev_s *dev);
+static sdio_capset_t kinetis_capabilities(FAR struct sdio_dev_s *dev);
+static sdio_statset_t kinetis_status(FAR struct sdio_dev_s *dev);
static void kinetis_widebus(FAR struct sdio_dev_s *dev, bool enable);
#ifdef CONFIG_KINETIS_SDHC_ABSFREQ
static void kinetis_frequency(FAR struct sdio_dev_s *dev, uint32_t frequency);
@@ -350,6 +351,7 @@ struct kinetis_dev_s g_sdhcdev =
.lock = kinetis_lock,
#endif
.reset = kinetis_reset,
+ .capabilities = kinetis_capabilities,
.status = kinetis_status,
.widebus = kinetis_widebus,
.clock = kinetis_clock,
@@ -1311,6 +1313,28 @@ static void kinetis_reset(FAR struct sdio_dev_s *dev)
priv->xfrints = 0; /* Interrupt enables for data transfer */
}
+/****************************************************************************
+ * Name: kinetis_capabilities
+ *
+ * Description:
+ * Get capabilities (and limitations) of the SDIO driver (optional)
+ *
+ * Input Parameters:
+ * dev - Device-specific state data
+ *
+ * Returned Value:
+ * Returns a bitset of status values (see SDIO_CAPS_* defines)
+ *
+ ****************************************************************************/
+
+static sdio_capset_t kinetis_capabilities(FAR struct sdio_dev_s *dev)
+{
+#ifdef CONFIG_KINETIS_SDHC_WIDTH_D1_ONLY
+ return SDIO_CAPS_1BIT_ONLY;
+#else
+ return 0;
+}
+
/****************************************************************************
* Name: kinetis_status
*
@@ -1325,7 +1349,7 @@ static void kinetis_reset(FAR struct sdio_dev_s *dev)
*
****************************************************************************/
-static uint8_t kinetis_status(FAR struct sdio_dev_s *dev)
+static sdio_statset_t kinetis_status(FAR struct sdio_dev_s *dev)
{
struct kinetis_dev_s *priv = (struct kinetis_dev_s *)dev;
return priv->cdstatus;
@@ -1560,7 +1584,7 @@ static void kinetis_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
break;
case CLOCK_SD_TRANSFER_1BIT : /* SD normal operation clocking (narrow 1-bit mode) */
-#ifndef CONFIG_SDIO_WIDTH_D1_ONLY
+#ifndef CONFIG_KINETIS_SDHC_WIDTH_D1_ONLY
frequency = CONFIG_KINETIS_SD1BIT_FREQ;
break;
#endif
@@ -1632,7 +1656,7 @@ static void kinetis_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
case CLOCK_SD_TRANSFER_1BIT : /* SD normal operation clocking (narrow
* 1-bit mode) */
-#ifndef CONFIG_SDIO_WIDTH_D1_ONLY
+#ifndef CONFIG_KINETIS_SDHC_WIDTH_D1_ONLY
regval |= (BOARD_SDHC_SD1MODE_PRESCALER | BOARD_SDHC_IDMODE_DIVISOR |
SDHC_SYSCTL_SDCLKEN | SDHC_SYSCTL_PEREN | SDHC_SYSCTL_HCKEN |
SDHC_SYSCTL_IPGEN);
@@ -2829,7 +2853,7 @@ FAR struct sdio_dev_s *sdhc_initialize(int slotno)
/* Data width 4 or 8 */
-#ifndef CONFIG_SDIO_WIDTH_D1_ONLY
+#ifndef CONFIG_KINETIS_SDHC_WIDTH_D1_ONLY
kinetis_pinconfig(PIN_SDHC0_D1);
kinetis_pinconfig(PIN_SDHC0_D2);
kinetis_pinconfig(PIN_SDHC0_D3);
@@ -2881,7 +2905,7 @@ FAR struct sdio_dev_s *sdhc_initialize(int slotno)
void sdhc_mediachange(FAR struct sdio_dev_s *dev, bool cardinslot)
{
struct kinetis_dev_s *priv = (struct kinetis_dev_s *)dev;
- uint8_t cdstatus;
+ sdio_statset_t cdstatus;
irqstate_t flags;
/* Update card status */
diff --git a/arch/arm/src/lpc17xx/Kconfig b/arch/arm/src/lpc17xx/Kconfig
index 7691b48a0e8..3d650b54000 100644
--- a/arch/arm/src/lpc17xx/Kconfig
+++ b/arch/arm/src/lpc17xx/Kconfig
@@ -630,7 +630,7 @@ config LPC17_I2C2_FREQUENCY
endmenu
-menu "SDIO Configuration"
+menu "SDCARD Configuration"
depends on LPC17_SDCARD
config SDIO_DMA
@@ -643,7 +643,7 @@ config SDIO_DMA
For most usages, SD accesses will cause data overruns if used without
DMA. Requires LPC17_SDCARD and config LPC17_GPDMA.
-config SDIO_WIDTH_D1_ONLY
+config LPC17_SDCARD_WIDTH_D1_ONLY
bool "Use D1 only"
default n
---help---
diff --git a/arch/arm/src/lpc17xx/lpc17_sdcard.c b/arch/arm/src/lpc17xx/lpc17_sdcard.c
index b4b555f5ded..90a8f3aad69 100644
--- a/arch/arm/src/lpc17xx/lpc17_sdcard.c
+++ b/arch/arm/src/lpc17xx/lpc17_sdcard.c
@@ -1,7 +1,7 @@
/****************************************************************************
* arch/arm/src/lpc17xx/lpc17_sdcard.c
*
- * Copyright (C) 2013-2014, 2016 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2013-2014, 2016-2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt
*
* Redistribution and use in source and binary forms, with or without
@@ -91,9 +91,9 @@
* CONFIG_SDIO_DMA - Enable SD card DMA. This is a marginally optional.
* For most usages, SD accesses will cause data overruns if used without DMA.
* NOTE the above system DMA configuration options.
- * CONFIG_SDIO_WIDTH_D1_ONLY - This may be selected to force the driver
- * operate with only a single data line (the default is to use all
- * 4 SD data lines).
+ * CONFIG_LPC17_SDCARD_WIDTH_D1_ONLY - This may be selected to force the
+ * driver operate with only a single data line (the default is to use
+ * all 4 SD data lines).
* CONFIG_DEBUG_MEMCARD_* - Enables some very low-level debug output
* This also requires CONFIG_DEBUG_FS and CONFIG_DEBUG_INFO
*/
@@ -247,7 +247,7 @@ struct lpc17_dev_s
/* Callback support */
- uint8_t cdstatus; /* Card status */
+ sdio_statset_t cdstatus; /* Card status */
sdio_eventset_t cbevents; /* Set of events to be cause callbacks */
worker_t callback; /* Registered callback function */
void *cbarg; /* Registered callback argument */
@@ -355,6 +355,7 @@ static int lpc17_lock(FAR struct sdio_dev_s *dev, bool lock);
/* Initialization/setup */
static void lpc17_reset(FAR struct sdio_dev_s *dev);
+static sdio_capset_t lpc17_capabilities(FAR struct sdio_dev_s *dev);
static uint8_t lpc17_status(FAR struct sdio_dev_s *dev);
static void lpc17_widebus(FAR struct sdio_dev_s *dev, bool enable);
static void lpc17_clock(FAR struct sdio_dev_s *dev,
@@ -419,6 +420,7 @@ struct lpc17_dev_s g_scard_dev =
.lock = lpc17_lock,
#endif
.reset = lpc17_reset,
+ .capabilities = lpc17_capabilities,
.status = lpc17_status,
.widebus = lpc17_widebus,
.clock = lpc17_clock,
@@ -1482,6 +1484,28 @@ static void lpc17_reset(FAR struct sdio_dev_s *dev)
getreg32(LPC17_SDCARD_CLOCK), getreg32(LPC17_SDCARD_PWR));
}
+/****************************************************************************
+ * Name: lpc17_capabilities
+ *
+ * Description:
+ * Get capabilities (and limitations) of the SDIO driver (optional)
+ *
+ * Input Parameters:
+ * dev - Device-specific state data
+ *
+ * Returned Value:
+ * Returns a bitset of status values (see SDIO_CAPS_* defines)
+ *
+ ****************************************************************************/
+
+static sdio_capset_t lpc17_capabilities(FAR struct sdio_dev_s *dev)
+{
+#ifdef CONFIG_LPC17_SDCARD_WIDTH_D1_ONLY
+ return SDIO_CAPS_1BIT_ONLY;
+#else
+ return 0;
+}
+
/****************************************************************************
* Name: lpc17_status
*
@@ -1496,7 +1520,7 @@ static void lpc17_reset(FAR struct sdio_dev_s *dev)
*
****************************************************************************/
-static uint8_t lpc17_status(FAR struct sdio_dev_s *dev)
+static sdio_statset_t lpc17_status(FAR struct sdio_dev_s *dev)
{
struct lpc17_dev_s *priv = (struct lpc17_dev_s *)dev;
return priv->cdstatus;
@@ -1569,7 +1593,7 @@ static void lpc17_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
/* SD normal operation clocking (wide 4-bit mode) */
case CLOCK_SD_TRANSFER_4BIT:
-#ifndef CONFIG_SDIO_WIDTH_D1_ONLY
+#ifndef CONFIG_LPC17_SDCARD_WIDTH_D1_ONLY
clkcr = (SDCARD_CLOCK_SDWIDEXFR | SDCARD_CLOCK_CLKEN);
break;
#endif
@@ -2735,7 +2759,7 @@ FAR struct sdio_dev_s *sdio_initialize(int slotno)
#ifndef CONFIG_SDIO_MUXBUS
lpc17_configgpio(GPIO_SD_DAT0);
-#ifndef CONFIG_SDIO_WIDTH_D1_ONLY
+#ifndef CONFIG_LPC17_SDCARD_WIDTH_D1_ONLY
lpc17_configgpio(GPIO_SD_DAT1);
lpc17_configgpio(GPIO_SD_DAT2);
lpc17_configgpio(GPIO_SD_DAT3);
@@ -2775,7 +2799,7 @@ FAR struct sdio_dev_s *sdio_initialize(int slotno)
void sdio_mediachange(FAR struct sdio_dev_s *dev, bool cardinslot)
{
struct lpc17_dev_s *priv = (struct lpc17_dev_s *)dev;
- uint8_t cdstatus;
+ sdio_statset_t cdstatus;
irqstate_t flags;
/* Update card status */
@@ -2798,6 +2822,7 @@ void sdio_mediachange(FAR struct sdio_dev_s *dev, bool cardinslot)
{
lpc17_callback(priv);
}
+
leave_critical_section(flags);
}
diff --git a/arch/arm/src/sam34/sam_hsmci.c b/arch/arm/src/sam34/sam_hsmci.c
index 2ad23303c49..ee8ad6a011b 100644
--- a/arch/arm/src/sam34/sam_hsmci.c
+++ b/arch/arm/src/sam34/sam_hsmci.c
@@ -1,7 +1,7 @@
/****************************************************************************
* arch/arm/src/sam34/sam_hsmci.c
*
- * Copyright (C) 2010, 2012-2014, 2016 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2010, 2012-2014, 2016-2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt
*
* Redistribution and use in source and binary forms, with or without
@@ -325,7 +325,7 @@ struct sam_dev_s
/* Callback support */
- uint8_t cdstatus; /* Card status */
+ sdio_statset_t cdstatus; /* Card status */
sdio_eventset_t cbevents; /* Set of events to be cause callbacks */
worker_t callback; /* Registered callback function */
void *cbarg; /* Registered callback argument */
@@ -464,7 +464,7 @@ static int sam_interrupt(int irq, void *context);
/* Initialization/setup */
static void sam_reset(FAR struct sdio_dev_s *dev);
-static uint8_t sam_status(FAR struct sdio_dev_s *dev);
+static sdio_statset_t sam_status(FAR struct sdio_dev_s *dev);
static void sam_widebus(FAR struct sdio_dev_s *dev, bool enable);
static void sam_clock(FAR struct sdio_dev_s *dev,
enum sdio_clock_e rate);
@@ -519,6 +519,7 @@ struct sam_dev_s g_sdiodev =
.dev =
{
.reset = sam_reset,
+ .capabilities = NULL,
.status = sam_status,
.widebus = sam_widebus,
.clock = sam_clock,
@@ -1470,7 +1471,7 @@ static void sam_reset(FAR struct sdio_dev_s *dev)
*
****************************************************************************/
-static uint8_t sam_status(FAR struct sdio_dev_s *dev)
+static sdio_statset_t sam_status(FAR struct sdio_dev_s *dev)
{
struct sam_dev_s *priv = (struct sam_dev_s *)dev;
return priv->cdstatus;
@@ -2738,7 +2739,7 @@ FAR struct sdio_dev_s *sdio_initialize(int slotno)
void sdio_mediachange(FAR struct sdio_dev_s *dev, bool cardinslot)
{
struct sam_dev_s *priv = (struct sam_dev_s *)dev;
- uint8_t cdstatus;
+ sdio_statset_t cdstatus;
irqstate_t flags;
/* Update card status */
diff --git a/arch/arm/src/sama5/sam_hsmci.c b/arch/arm/src/sama5/sam_hsmci.c
index 165a8f1a12d..c1012f802ad 100644
--- a/arch/arm/src/sama5/sam_hsmci.c
+++ b/arch/arm/src/sama5/sam_hsmci.c
@@ -1,7 +1,7 @@
/****************************************************************************
* arch/arm/src/sama5/sam_hsmci.c
*
- * Copyright (C) 2013-2014, 2016 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2013-2014, 2016-2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt
*
* Redistribution and use in source and binary forms, with or without
@@ -407,7 +407,7 @@ struct sam_dev_s
/* Callback support */
- uint8_t cdstatus; /* Card status */
+ sdio_statset_t cdstatus; /* Card status */
sdio_eventset_t cbevents; /* Set of events to be cause callbacks */
worker_t callback; /* Registered callback function */
void *cbarg; /* Registered callback argument */
@@ -547,7 +547,7 @@ static int sam_hsmci2_interrupt(int irq, void *context);
/* Initialization/setup */
static void sam_reset(FAR struct sdio_dev_s *dev);
-static uint8_t sam_status(FAR struct sdio_dev_s *dev);
+static sdio_statset_t sam_status(FAR struct sdio_dev_s *dev);
static void sam_widebus(FAR struct sdio_dev_s *dev, bool enable);
static void sam_clock(FAR struct sdio_dev_s *dev,
enum sdio_clock_e rate);
@@ -609,6 +609,7 @@ static void sam_callback(void *arg);
static const struct sdio_dev_s g_callbacks =
{
.reset = sam_reset,
+ .capabilities = NULL,
.status = sam_status,
.widebus = sam_widebus,
.clock = sam_clock,
@@ -1788,7 +1789,7 @@ static void sam_reset(FAR struct sdio_dev_s *dev)
*
****************************************************************************/
-static uint8_t sam_status(FAR struct sdio_dev_s *dev)
+static sdio_statset_t sam_status(FAR struct sdio_dev_s *dev)
{
struct sam_dev_s *priv = (struct sam_dev_s *)dev;
return priv->cdstatus;
@@ -3389,7 +3390,7 @@ FAR struct sdio_dev_s *sdio_initialize(int slotno)
void sdio_mediachange(FAR struct sdio_dev_s *dev, bool cardinslot)
{
struct sam_dev_s *priv = (struct sam_dev_s *)dev;
- uint8_t cdstatus;
+ sdio_statset_t cdstatus;
irqstate_t flags;
/* Update card status. Interrupts are disabled here because if we are
diff --git a/arch/arm/src/samv7/sam_hsmci.c b/arch/arm/src/samv7/sam_hsmci.c
index 589a8cbf87d..9839a4da6b3 100644
--- a/arch/arm/src/samv7/sam_hsmci.c
+++ b/arch/arm/src/samv7/sam_hsmci.c
@@ -1,7 +1,7 @@
/****************************************************************************
* arch/arm/src/samv7/sam_hsmci.c
*
- * Copyright (C) 2015-2016 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2015-2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt
*
* Redistribution and use in source and binary forms, with or without
@@ -341,7 +341,7 @@ struct sam_dev_s
/* Callback support */
- uint8_t cdstatus; /* Card status */
+ sdio_statset_t cdstatus; /* Card status */
sdio_eventset_t cbevents; /* Set of events to be cause callbacks */
worker_t callback; /* Registered callback function */
void *cbarg; /* Registered callback argument */
@@ -478,7 +478,7 @@ static int sam_hsmci1_interrupt(int irq, void *context);
/* Initialization/setup */
static void sam_reset(FAR struct sdio_dev_s *dev);
-static uint8_t sam_status(FAR struct sdio_dev_s *dev);
+static sdio_statset_t sam_status(FAR struct sdio_dev_s *dev);
static void sam_widebus(FAR struct sdio_dev_s *dev, bool enable);
static void sam_clock(FAR struct sdio_dev_s *dev,
enum sdio_clock_e rate);
@@ -540,6 +540,7 @@ static void sam_callback(void *arg);
static const struct sdio_dev_s g_callbacks =
{
.reset = sam_reset,
+ .capabilities = NULL,
.status = sam_status,
.widebus = sam_widebus,
.clock = sam_clock,
@@ -1762,7 +1763,7 @@ static void sam_reset(FAR struct sdio_dev_s *dev)
*
****************************************************************************/
-static uint8_t sam_status(FAR struct sdio_dev_s *dev)
+static sdio_statset_t sam_status(FAR struct sdio_dev_s *dev)
{
struct sam_dev_s *priv = (struct sam_dev_s *)dev;
return priv->cdstatus;
@@ -3410,7 +3411,7 @@ FAR struct sdio_dev_s *sdio_initialize(int slotno)
void sdio_mediachange(FAR struct sdio_dev_s *dev, bool cardinslot)
{
struct sam_dev_s *priv = (struct sam_dev_s *)dev;
- uint8_t cdstatus;
+ sdio_statset_t cdstatus;
irqstate_t flags;
/* Update card status. Interrupts are disabled here because if we are
diff --git a/arch/arm/src/stm32/Kconfig b/arch/arm/src/stm32/Kconfig
index 189b5a63998..a25286cbe74 100644
--- a/arch/arm/src/stm32/Kconfig
+++ b/arch/arm/src/stm32/Kconfig
@@ -6103,7 +6103,7 @@ config SDIO_DMAPRIO
For other STM32's, options are: 0x00000000 low, 0x00010000 medium,
0x00020000 high, 0x00030000 very high. Default: medium.
-config SDIO_WIDTH_D1_ONLY
+config STM32_SDIO_WIDTH_D1_ONLY
bool "Use D1 only"
default n
---help---
diff --git a/arch/arm/src/stm32/chip/stm32f103r_pinmap.h b/arch/arm/src/stm32/chip/stm32f103r_pinmap.h
index e654104e0e9..7750f67f1ac 100644
--- a/arch/arm/src/stm32/chip/stm32f103r_pinmap.h
+++ b/arch/arm/src/stm32/chip/stm32f103r_pinmap.h
@@ -342,7 +342,7 @@
#define GPIO_SDIO_D0 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN8)
-#ifndef CONFIG_SDIO_WIDTH_D1_ONLY
+#ifndef CONFIG_STM32_SDIO_WIDTH_D1_ONLY
# define GPIO_SDIO_D1 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN9)
# define GPIO_SDIO_D2 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN10)
# define GPIO_SDIO_D3 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN11)
diff --git a/arch/arm/src/stm32/chip/stm32f103v_pinmap.h b/arch/arm/src/stm32/chip/stm32f103v_pinmap.h
index c4feb129612..eabf76506bd 100644
--- a/arch/arm/src/stm32/chip/stm32f103v_pinmap.h
+++ b/arch/arm/src/stm32/chip/stm32f103v_pinmap.h
@@ -83,7 +83,7 @@
#define GPIO_SDIO_D0 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN8)
-#ifndef CONFIG_SDIO_WIDTH_D1_ONLY
+#ifndef CONFIG_STM32_SDIO_WIDTH_D1_ONLY
# define GPIO_SDIO_D1 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN9)
# define GPIO_SDIO_D2 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN10)
# define GPIO_SDIO_D3 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN11)
diff --git a/arch/arm/src/stm32/chip/stm32f103z_pinmap.h b/arch/arm/src/stm32/chip/stm32f103z_pinmap.h
index 993708a5ecf..c0b3388ead3 100644
--- a/arch/arm/src/stm32/chip/stm32f103z_pinmap.h
+++ b/arch/arm/src/stm32/chip/stm32f103z_pinmap.h
@@ -451,7 +451,7 @@
#define GPIO_SDIO_D0 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN8)
-#ifndef CONFIG_SDIO_WIDTH_D1_ONLY
+#ifndef CONFIG_STM32_SDIO_WIDTH_D1_ONLY
# define GPIO_SDIO_D1 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN9)
# define GPIO_SDIO_D2 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN10)
# define GPIO_SDIO_D3 (GPIO_ALT|GPIO_CNF_AFPP|GPIO_MODE_50MHz|GPIO_PORTC|GPIO_PIN11)
diff --git a/arch/arm/src/stm32/stm32_sdio.c b/arch/arm/src/stm32/stm32_sdio.c
index 58071e84f46..59a25215274 100644
--- a/arch/arm/src/stm32/stm32_sdio.c
+++ b/arch/arm/src/stm32/stm32_sdio.c
@@ -1,7 +1,7 @@
/****************************************************************************
* arch/arm/src/stm32/stm32_sdio.c
*
- * Copyright (C) 2009, 2011-2014, 2016 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2009, 2011-2014, 2016-2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt
*
* Redistribution and use in source and binary forms, with or without
@@ -88,9 +88,9 @@
* CONFIG_SDIO_DMA - Enable SDIO. This is a marginally optional. For
* most usages, SDIO will cause data overruns if used without DMA.
* NOTE the above system DMA configuration options.
- * CONFIG_SDIO_WIDTH_D1_ONLY - This may be selected to force the driver
- * operate with only a single data line (the default is to use all
- * 4 SD data lines).
+ * CONFIG_STM32_SDIO_WIDTH_D1_ONLY - This may be selected to force the
+ * driver operate with only a single data line (the default is to use
+ * all 4 SD data lines).
* CONFIG_SDIO_PRI - SDIO interrupt priority. This setting is not very
* important since interrupt nesting is not currently supported.
* CONFIG_SDM_DMAPRIO - SDIO DMA priority. This can be selecte if
@@ -314,7 +314,7 @@ struct stm32_dev_s
/* Callback support */
- uint8_t cdstatus; /* Card status */
+ sdio_statset_t cdstatus; /* Card status */
sdio_eventset_t cbevents; /* Set of events to be cause callbacks */
worker_t callback; /* Registered callback function */
void *cbarg; /* Registered callback argument */
@@ -425,7 +425,8 @@ static int stm32_lock(FAR struct sdio_dev_s *dev, bool lock);
/* Initialization/setup */
static void stm32_reset(FAR struct sdio_dev_s *dev);
-static uint8_t stm32_status(FAR struct sdio_dev_s *dev);
+static sdio_capset_t stm32_capabilities(FAR struct sdio_dev_s *dev);
+static sdio_statset_t stm32_status(FAR struct sdio_dev_s *dev);
static void stm32_widebus(FAR struct sdio_dev_s *dev, bool enable);
static void stm32_clock(FAR struct sdio_dev_s *dev,
enum sdio_clock_e rate);
@@ -493,6 +494,7 @@ struct stm32_dev_s g_sdiodev =
.lock = stm32_lock,
#endif
.reset = stm32_reset,
+ .capabilities = stm32_capabilities,
.status = stm32_status,
.widebus = stm32_widebus,
.clock = stm32_clock,
@@ -1602,6 +1604,28 @@ static void stm32_reset(FAR struct sdio_dev_s *dev)
getreg32(STM32_SDIO_CLKCR), getreg32(STM32_SDIO_POWER));
}
+/****************************************************************************
+ * Name: stm32_capabilities
+ *
+ * Description:
+ * Get capabilities (and limitations) of the SDIO driver (optional)
+ *
+ * Input Parameters:
+ * dev - Device-specific state data
+ *
+ * Returned Value:
+ * Returns a bitset of status values (see SDIO_CAPS_* defines)
+ *
+ ****************************************************************************/
+
+static sdio_capset_t stm32_capabilities(FAR struct sdio_dev_s *dev)
+{
+#ifdef CONFIG_STM32_SDIO_WIDTH_D1_ONLY
+ return SDIO_CAPS_1BIT_ONLY;
+#else
+ return 0;
+}
+
/****************************************************************************
* Name: stm32_status
*
@@ -1616,7 +1640,7 @@ static void stm32_reset(FAR struct sdio_dev_s *dev)
*
****************************************************************************/
-static uint8_t stm32_status(FAR struct sdio_dev_s *dev)
+static sdio_statset_t stm32_status(FAR struct sdio_dev_s *dev)
{
struct stm32_dev_s *priv = (struct stm32_dev_s *)dev;
return priv->cdstatus;
@@ -1688,7 +1712,7 @@ static void stm32_clock(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate)
/* SD normal operation clocking (wide 4-bit mode) */
case CLOCK_SD_TRANSFER_4BIT:
-#ifndef CONFIG_SDIO_WIDTH_D1_ONLY
+#ifndef CONFIG_STM32_SDIO_WIDTH_D1_ONLY
clckr = (SDIO_CLCKR_SDWIDEXFR | SDIO_CLKCR_CLKEN);
break;
#endif
@@ -2897,7 +2921,7 @@ FAR struct sdio_dev_s *sdio_initialize(int slotno)
#ifndef CONFIG_SDIO_MUXBUS
stm32_configgpio(GPIO_SDIO_D0);
-#ifndef CONFIG_SDIO_WIDTH_D1_ONLY
+#ifndef CONFIG_STM32_SDIO_WIDTH_D1_ONLY
stm32_configgpio(GPIO_SDIO_D1);
stm32_configgpio(GPIO_SDIO_D2);
stm32_configgpio(GPIO_SDIO_D3);
@@ -2936,7 +2960,7 @@ FAR struct sdio_dev_s *sdio_initialize(int slotno)
void sdio_mediachange(FAR struct sdio_dev_s *dev, bool cardinslot)
{
struct stm32_dev_s *priv = (struct stm32_dev_s *)dev;
- uint8_t cdstatus;
+ sdio_statset_t cdstatus;
irqstate_t flags;
/* Update card status */
diff --git a/arch/arm/src/stm32f7/stm32_sdmmc.c b/arch/arm/src/stm32f7/stm32_sdmmc.c
index 2df98c10a94..f6fb0dfaee2 100644
--- a/arch/arm/src/stm32f7/stm32_sdmmc.c
+++ b/arch/arm/src/stm32f7/stm32_sdmmc.c
@@ -1,7 +1,7 @@
/****************************************************************************
* arch/arm/src/stm32f7/stm32_sdmmc.c
*
- * Copyright (C) 2009, 2011-2016 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2009, 2011-2017 Gregory Nutt. All rights reserved.
* Authors: Gregory Nutt
* David Sidrane
*
@@ -366,7 +366,7 @@ struct stm32_dev_s
/* Callback support */
- uint8_t cdstatus; /* Card status */
+ sdio_statset_t cdstatus; /* Card status */
sdio_eventset_t cbevents; /* Set of events to be cause callbacks */
worker_t callback; /* Registered callback function */
void *cbarg; /* Registered callback argument */
@@ -495,7 +495,7 @@ static int stm32_lock(FAR struct sdio_dev_s *dev, bool lock);
/* Initialization/setup */
static void stm32_reset(FAR struct sdio_dev_s *dev);
-static uint8_t stm32_status(FAR struct sdio_dev_s *dev);
+static sdio_statset_t stm32_status(FAR struct sdio_dev_s *dev);
static void stm32_widebus(FAR struct sdio_dev_s *dev, bool enable);
static void stm32_clock(FAR struct sdio_dev_s *dev,
enum sdio_clock_e rate);
@@ -563,6 +563,7 @@ struct stm32_dev_s g_sdmmcdev1 =
.lock = stm32_lock,
#endif
.reset = stm32_reset,
+ .capabilities = NULL,
.status = stm32_status,
.widebus = stm32_widebus,
.clock = stm32_clock,
@@ -619,6 +620,7 @@ struct stm32_dev_s g_sdmmcdev2 =
.lock = stm32_lock,
#endif
.reset = stm32_reset,
+ .capabilities = NULL,
.status = stm32_status,
.widebus = stm32_widebus,
.clock = stm32_clock,
@@ -1866,7 +1868,7 @@ static void stm32_reset(FAR struct sdio_dev_s *dev)
*
****************************************************************************/
-static uint8_t stm32_status(FAR struct sdio_dev_s *dev)
+static sdio_statset_t stm32_status(FAR struct sdio_dev_s *dev)
{
struct stm32_dev_s *priv = (struct stm32_dev_s *)dev;
return priv->cdstatus;
@@ -3276,7 +3278,7 @@ FAR struct sdio_dev_s *sdio_initialize(int slotno)
void sdio_mediachange(FAR struct sdio_dev_s *dev, bool cardinslot)
{
struct stm32_dev_s *priv = (struct stm32_dev_s *)dev;
- uint8_t cdstatus;
+ sdio_statset_t cdstatus;
irqstate_t flags;
/* Update card status */
diff --git a/configs/fire-stm32v2/README.txt b/configs/fire-stm32v2/README.txt
index d0084461184..56ffae8d0ec 100644
--- a/configs/fire-stm32v2/README.txt
+++ b/configs/fire-stm32v2/README.txt
@@ -739,7 +739,7 @@ M3 Wildfire-specific Configuration Options
CONFIG_SDIO_PRI - Select SDIO interrupt prority. Default: 128
CONFIG_SDIO_DMAPRIO - Select SDIO DMA interrupt priority.
Default: Medium
- CONFIG_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
+ CONFIG_STM32_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
4-bit transfer mode.
M3 Wildfire CAN Configuration
diff --git a/configs/fire-stm32v2/nsh/defconfig b/configs/fire-stm32v2/nsh/defconfig
index e1d3062b226..018733b94d9 100644
--- a/configs/fire-stm32v2/nsh/defconfig
+++ b/configs/fire-stm32v2/nsh/defconfig
@@ -157,7 +157,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# STM32 Configuration Options
diff --git a/configs/freedom-k64f/nsh/defconfig b/configs/freedom-k64f/nsh/defconfig
index 5015fa5f77c..e0791e471e3 100644
--- a/configs/freedom-k64f/nsh/defconfig
+++ b/configs/freedom-k64f/nsh/defconfig
@@ -249,7 +249,6 @@ CONFIG_KINETIS_PORTEINTS=y
#
# CONFIG_KINETIS_UARTFIFOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# Architecture Options
diff --git a/configs/hymini-stm32v/README.txt b/configs/hymini-stm32v/README.txt
index 7fec3b1562c..d688603e528 100644
--- a/configs/hymini-stm32v/README.txt
+++ b/configs/hymini-stm32v/README.txt
@@ -481,7 +481,7 @@ HY-Mini specific Configuration Options
CONFIG_SDIO_PRI - Select SDIO interrupt prority. Default: 128
CONFIG_SDIO_DMAPRIO - Select SDIO DMA interrupt priority.
Default: Medium
- CONFIG_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
+ CONFIG_STM32_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
4-bit transfer mode.
CONFIG_MMCSD_HAVECARDDETECT - Select if SDIO driver card detection
is 100% accurate (it is on the HY-MiniSTM32V)
diff --git a/configs/hymini-stm32v/nsh/defconfig b/configs/hymini-stm32v/nsh/defconfig
index d131caecba2..1f7c9b3b54c 100644
--- a/configs/hymini-stm32v/nsh/defconfig
+++ b/configs/hymini-stm32v/nsh/defconfig
@@ -146,7 +146,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# STM32 Configuration Options
diff --git a/configs/hymini-stm32v/nsh2/defconfig b/configs/hymini-stm32v/nsh2/defconfig
index d2ad91e2d80..6be72ffd01b 100644
--- a/configs/hymini-stm32v/nsh2/defconfig
+++ b/configs/hymini-stm32v/nsh2/defconfig
@@ -149,7 +149,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# STM32 Configuration Options
diff --git a/configs/hymini-stm32v/usbmsc/defconfig b/configs/hymini-stm32v/usbmsc/defconfig
index 5fca4219a38..efe3fd6327f 100644
--- a/configs/hymini-stm32v/usbmsc/defconfig
+++ b/configs/hymini-stm32v/usbmsc/defconfig
@@ -146,7 +146,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# STM32 Configuration Options
diff --git a/configs/mikroe-stm32f4/README.txt b/configs/mikroe-stm32f4/README.txt
index ad0da7986f8..8b18073799b 100644
--- a/configs/mikroe-stm32f4/README.txt
+++ b/configs/mikroe-stm32f4/README.txt
@@ -678,7 +678,7 @@ Mikroe-STM32F4-specific Configuration Options
CONFIG_SDIO_PRI - Select SDIO interrupt prority. Default: 128
CONFIG_SDIO_DMAPRIO - Select SDIO DMA interrupt priority.
Default: Medium
- CONFIG_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
+ CONFIG_STM32_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
4-bit transfer mode.
STM32 USB OTG FS Host Driver Support
diff --git a/configs/open1788/knsh/defconfig b/configs/open1788/knsh/defconfig
index edd0db574cd..050c603b37a 100644
--- a/configs/open1788/knsh/defconfig
+++ b/configs/open1788/knsh/defconfig
@@ -233,7 +233,6 @@ CONFIG_LPC17_GPDMA=y
# SDIO Configuration
#
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# Architecture Options
diff --git a/configs/open1788/nsh/defconfig b/configs/open1788/nsh/defconfig
index 9635a2a23c5..7d57dd4e881 100644
--- a/configs/open1788/nsh/defconfig
+++ b/configs/open1788/nsh/defconfig
@@ -227,7 +227,6 @@ CONFIG_LPC17_GPDMA=y
# SDIO Configuration
#
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# Architecture Options
diff --git a/configs/open1788/nxlines/defconfig b/configs/open1788/nxlines/defconfig
index 2219e666807..df31a8370f2 100644
--- a/configs/open1788/nxlines/defconfig
+++ b/configs/open1788/nxlines/defconfig
@@ -240,7 +240,6 @@ CONFIG_LPC17_EXTDRAMHEAP=y
# SDIO Configuration
#
# CONFIG_SDIO_DMA is not set
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# LCD device driver options
diff --git a/configs/sam4s-xplained-pro/nsh/defconfig b/configs/sam4s-xplained-pro/nsh/defconfig
index aba86e5a94a..f612de1b0d6 100644
--- a/configs/sam4s-xplained-pro/nsh/defconfig
+++ b/configs/sam4s-xplained-pro/nsh/defconfig
@@ -154,7 +154,6 @@ CONFIG_ARCH_HAVE_EXTNAND=y
CONFIG_ARCH_HAVE_EXTNOR=y
CONFIG_ARCH_HAVE_EXTSRAM0=y
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
CONFIG_ARCH_HAVE_EXTSRAM1=y
#
diff --git a/configs/sama5d3x-ek/demo/defconfig b/configs/sama5d3x-ek/demo/defconfig
index b2c780cec3e..dd0311cfdf7 100644
--- a/configs/sama5d3x-ek/demo/defconfig
+++ b/configs/sama5d3x-ek/demo/defconfig
@@ -148,7 +148,6 @@ CONFIG_ARMV7A_TOOLCHAIN_CODESOURCERYW=y
# CONFIG_ARMV7A_DECODEFIQ is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
# CONFIG_USBHOST_BULK_DISABLE is not set
# CONFIG_USBHOST_INT_DISABLE is not set
CONFIG_USBHOST_ISOC_DISABLE=y
diff --git a/configs/sama5d3x-ek/nxplayer/defconfig b/configs/sama5d3x-ek/nxplayer/defconfig
index a7b85b1c979..6dd88ea2ff2 100644
--- a/configs/sama5d3x-ek/nxplayer/defconfig
+++ b/configs/sama5d3x-ek/nxplayer/defconfig
@@ -148,7 +148,6 @@ CONFIG_ARMV7A_TOOLCHAIN_CODESOURCERYW=y
# CONFIG_ARMV7A_DECODEFIQ is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# SAMA5 Configuration Options
diff --git a/configs/sama5d4-ek/ipv6/defconfig b/configs/sama5d4-ek/ipv6/defconfig
index 67f1ab92be3..7d80bb79f3c 100644
--- a/configs/sama5d4-ek/ipv6/defconfig
+++ b/configs/sama5d4-ek/ipv6/defconfig
@@ -156,7 +156,6 @@ CONFIG_ARMV7A_TOOLCHAIN_CODESOURCERYW=y
# CONFIG_ARMV7A_DECODEFIQ is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
# CONFIG_USBHOST_BULK_DISABLE is not set
# CONFIG_USBHOST_INT_DISABLE is not set
CONFIG_USBHOST_ISOC_DISABLE=y
diff --git a/configs/sama5d4-ek/knsh/defconfig b/configs/sama5d4-ek/knsh/defconfig
index ac0cde34761..f36f9a47cd2 100644
--- a/configs/sama5d4-ek/knsh/defconfig
+++ b/configs/sama5d4-ek/knsh/defconfig
@@ -163,7 +163,6 @@ CONFIG_ARMV7A_TOOLCHAIN_CODESOURCERYW=y
# CONFIG_ARMV7A_DECODEFIQ is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# SAMA5 Configuration Options
diff --git a/configs/sama5d4-ek/nsh/defconfig b/configs/sama5d4-ek/nsh/defconfig
index 46147399c04..2b6beec9679 100644
--- a/configs/sama5d4-ek/nsh/defconfig
+++ b/configs/sama5d4-ek/nsh/defconfig
@@ -156,7 +156,6 @@ CONFIG_ARMV7A_TOOLCHAIN_CODESOURCERYW=y
# CONFIG_ARMV7A_DECODEFIQ is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
# CONFIG_USBHOST_BULK_DISABLE is not set
# CONFIG_USBHOST_INT_DISABLE is not set
CONFIG_USBHOST_ISOC_DISABLE=y
diff --git a/configs/sama5d4-ek/nxwm/defconfig b/configs/sama5d4-ek/nxwm/defconfig
index 27fba273fbd..e05a8ae0360 100644
--- a/configs/sama5d4-ek/nxwm/defconfig
+++ b/configs/sama5d4-ek/nxwm/defconfig
@@ -158,7 +158,6 @@ CONFIG_ARMV7A_TOOLCHAIN_CODESOURCERYW=y
# CONFIG_ARMV7A_DECODEFIQ is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
# CONFIG_USBHOST_BULK_DISABLE is not set
# CONFIG_USBHOST_INT_DISABLE is not set
CONFIG_USBHOST_ISOC_DISABLE=y
diff --git a/configs/same70-xplained/netnsh/defconfig b/configs/same70-xplained/netnsh/defconfig
index 825777c9836..e6f8e03265f 100644
--- a/configs/same70-xplained/netnsh/defconfig
+++ b/configs/same70-xplained/netnsh/defconfig
@@ -167,7 +167,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# SAMV7 Configuration Options
diff --git a/configs/same70-xplained/nsh/defconfig b/configs/same70-xplained/nsh/defconfig
index 55b33c499a4..07a14e7162c 100644
--- a/configs/same70-xplained/nsh/defconfig
+++ b/configs/same70-xplained/nsh/defconfig
@@ -167,7 +167,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# SAMV7 Configuration Options
diff --git a/configs/samv71-xult/knsh/defconfig b/configs/samv71-xult/knsh/defconfig
index 88f99b6d706..ef3880e3cd6 100644
--- a/configs/samv71-xult/knsh/defconfig
+++ b/configs/samv71-xult/knsh/defconfig
@@ -173,7 +173,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# SAMV7 Configuration Options
diff --git a/configs/samv71-xult/mxtxplnd/defconfig b/configs/samv71-xult/mxtxplnd/defconfig
index df371d6b261..2f6c0e4894e 100644
--- a/configs/samv71-xult/mxtxplnd/defconfig
+++ b/configs/samv71-xult/mxtxplnd/defconfig
@@ -167,7 +167,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# SAMV7 Configuration Options
diff --git a/configs/samv71-xult/netnsh/defconfig b/configs/samv71-xult/netnsh/defconfig
index dffa7df6eb6..261cefd61b3 100644
--- a/configs/samv71-xult/netnsh/defconfig
+++ b/configs/samv71-xult/netnsh/defconfig
@@ -168,7 +168,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# SAMV7 Configuration Options
diff --git a/configs/samv71-xult/nsh/defconfig b/configs/samv71-xult/nsh/defconfig
index 9dfffe37a8f..3bb91928d6c 100644
--- a/configs/samv71-xult/nsh/defconfig
+++ b/configs/samv71-xult/nsh/defconfig
@@ -167,7 +167,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# SAMV7 Configuration Options
diff --git a/configs/samv71-xult/nxwm/defconfig b/configs/samv71-xult/nxwm/defconfig
index 0a7d997244d..4433f29d50e 100644
--- a/configs/samv71-xult/nxwm/defconfig
+++ b/configs/samv71-xult/nxwm/defconfig
@@ -167,7 +167,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# SAMV7 Configuration Options
diff --git a/configs/samv71-xult/vnc/defconfig b/configs/samv71-xult/vnc/defconfig
index 0ec583e494b..2d8ddf9ef9c 100644
--- a/configs/samv71-xult/vnc/defconfig
+++ b/configs/samv71-xult/vnc/defconfig
@@ -167,7 +167,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# SAMV7 Configuration Options
diff --git a/configs/samv71-xult/vnxwm/defconfig b/configs/samv71-xult/vnxwm/defconfig
index 7867d3a5cd1..f3423b42603 100644
--- a/configs/samv71-xult/vnxwm/defconfig
+++ b/configs/samv71-xult/vnxwm/defconfig
@@ -167,7 +167,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# SAMV7 Configuration Options
diff --git a/configs/stm3210e-eval/README.txt b/configs/stm3210e-eval/README.txt
index 050276b5bbc..c5cff1b40ac 100644
--- a/configs/stm3210e-eval/README.txt
+++ b/configs/stm3210e-eval/README.txt
@@ -638,7 +638,7 @@ STM3210E-EVAL-specific Configuration Options
CONFIG_SDIO_PRI - Select SDIO interrupt prority. Default: 128
CONFIG_SDIO_DMAPRIO - Select SDIO DMA interrupt priority.
Default: Medium
- CONFIG_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
+ CONFIG_STM32_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
4-bit transfer mode.
STM3210E-EVAL CAN Configuration
diff --git a/configs/stm3210e-eval/composite/defconfig b/configs/stm3210e-eval/composite/defconfig
index f05c251cc55..f6e363ed1f4 100644
--- a/configs/stm3210e-eval/composite/defconfig
+++ b/configs/stm3210e-eval/composite/defconfig
@@ -159,7 +159,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# STM32 Configuration Options
diff --git a/configs/stm3210e-eval/nsh/defconfig b/configs/stm3210e-eval/nsh/defconfig
index 7354fbee6b6..81dfa3d8666 100644
--- a/configs/stm3210e-eval/nsh/defconfig
+++ b/configs/stm3210e-eval/nsh/defconfig
@@ -160,7 +160,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# STM32 Configuration Options
diff --git a/configs/stm3210e-eval/nsh2/defconfig b/configs/stm3210e-eval/nsh2/defconfig
index 466ca43309a..f672d519d49 100644
--- a/configs/stm3210e-eval/nsh2/defconfig
+++ b/configs/stm3210e-eval/nsh2/defconfig
@@ -159,7 +159,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# STM32 Configuration Options
diff --git a/configs/stm3210e-eval/usbmsc/defconfig b/configs/stm3210e-eval/usbmsc/defconfig
index 1200c7ded24..27abaab4c3e 100644
--- a/configs/stm3210e-eval/usbmsc/defconfig
+++ b/configs/stm3210e-eval/usbmsc/defconfig
@@ -150,7 +150,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# STM32 Configuration Options
diff --git a/configs/stm3220g-eval/README.txt b/configs/stm3220g-eval/README.txt
index 2ffb33194da..12c27676cad 100644
--- a/configs/stm3220g-eval/README.txt
+++ b/configs/stm3220g-eval/README.txt
@@ -776,7 +776,7 @@ STM3220G-EVAL-specific Configuration Options
CONFIG_SDIO_PRI - Select SDIO interrupt prority. Default: 128
CONFIG_SDIO_DMAPRIO - Select SDIO DMA interrupt priority.
Default: Medium
- CONFIG_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
+ CONFIG_STM32_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
4-bit transfer mode.
CONFIG_STM32_PHYADDR - The 5-bit address of the PHY on the board
diff --git a/configs/stm3220g-eval/nsh2/defconfig b/configs/stm3220g-eval/nsh2/defconfig
index c0e93f5797d..394b0498dfe 100644
--- a/configs/stm3220g-eval/nsh2/defconfig
+++ b/configs/stm3220g-eval/nsh2/defconfig
@@ -156,7 +156,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_STACKCHECK is not set
# CONFIG_ARMV7M_ITMSYSLOG is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# STM32 Configuration Options
diff --git a/configs/stm3240g-eval/README.txt b/configs/stm3240g-eval/README.txt
index 9b2e6b97cc8..5eb83c1d519 100644
--- a/configs/stm3240g-eval/README.txt
+++ b/configs/stm3240g-eval/README.txt
@@ -769,7 +769,7 @@ STM3240G-EVAL-specific Configuration Options
CONFIG_SDIO_PRI - Select SDIO interrupt prority. Default: 128
CONFIG_SDIO_DMAPRIO - Select SDIO DMA interrupt priority.
Default: Medium
- CONFIG_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
+ CONFIG_STM32_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
4-bit transfer mode.
CONFIG_STM32_PHYADDR - The 5-bit address of the PHY on the board
diff --git a/configs/stm3240g-eval/nsh2/defconfig b/configs/stm3240g-eval/nsh2/defconfig
index ed8994fa6b0..b9214100d25 100644
--- a/configs/stm3240g-eval/nsh2/defconfig
+++ b/configs/stm3240g-eval/nsh2/defconfig
@@ -157,7 +157,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_STACKCHECK is not set
# CONFIG_ARMV7M_ITMSYSLOG is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# STM32 Configuration Options
diff --git a/configs/stm32f429i-disco/README.txt b/configs/stm32f429i-disco/README.txt
index 5eb382ec28e..3d327345ce7 100644
--- a/configs/stm32f429i-disco/README.txt
+++ b/configs/stm32f429i-disco/README.txt
@@ -612,7 +612,7 @@ STM32F429I-DISCO-specific Configuration Options
CONFIG_SDIO_PRI - Select SDIO interrupt prority. Default: 128
CONFIG_SDIO_DMAPRIO - Select SDIO DMA interrupt priority.
Default: Medium
- CONFIG_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
+ CONFIG_STM32_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
4-bit transfer mode.
STM32 USB OTG FS Host Driver Support
diff --git a/configs/stm32f4discovery/README.txt b/configs/stm32f4discovery/README.txt
index aaa37fe7f7e..7b7ddee5a98 100644
--- a/configs/stm32f4discovery/README.txt
+++ b/configs/stm32f4discovery/README.txt
@@ -1044,7 +1044,7 @@ STM32F4Discovery-specific Configuration Options
CONFIG_SDIO_PRI - Select SDIO interrupt prority. Default: 128
CONFIG_SDIO_DMAPRIO - Select SDIO DMA interrupt priority.
Default: Medium
- CONFIG_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
+ CONFIG_STM32_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
4-bit transfer mode.
STM32 USB OTG FS Host Driver Support
diff --git a/configs/stm32f4discovery/ipv6/defconfig b/configs/stm32f4discovery/ipv6/defconfig
index 86f04eba83c..abb16ec5a34 100644
--- a/configs/stm32f4discovery/ipv6/defconfig
+++ b/configs/stm32f4discovery/ipv6/defconfig
@@ -158,7 +158,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# STM32 Configuration Options
diff --git a/configs/stm32f4discovery/netnsh/defconfig b/configs/stm32f4discovery/netnsh/defconfig
index d76145194fb..0da83b99e0e 100644
--- a/configs/stm32f4discovery/netnsh/defconfig
+++ b/configs/stm32f4discovery/netnsh/defconfig
@@ -158,7 +158,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
CONFIG_SDIO_DMA=y
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
#
# STM32 Configuration Options
diff --git a/configs/stm32f746-ws/nsh/defconfig b/configs/stm32f746-ws/nsh/defconfig
index 7ed9d1ffb36..35a84eacdee 100644
--- a/configs/stm32f746-ws/nsh/defconfig
+++ b/configs/stm32f746-ws/nsh/defconfig
@@ -155,7 +155,6 @@ CONFIG_ARMV7M_HAVE_STACKCHECK=y
# CONFIG_ARMV7M_ITMSYSLOG is not set
# CONFIG_SERIAL_TERMIOS is not set
# CONFIG_SDIO_DMA is not set
-# CONFIG_SDIO_WIDTH_D1_ONLY is not set
# CONFIG_USART6_RS485 is not set
# CONFIG_USART6_RXDMA is not set
# CONFIG_SERIAL_DISABLE_REORDERING is not set
diff --git a/configs/stm32f746g-disco/README.txt b/configs/stm32f746g-disco/README.txt
index 66dfb79ba4f..98f945a187a 100644
--- a/configs/stm32f746g-disco/README.txt
+++ b/configs/stm32f746g-disco/README.txt
@@ -426,7 +426,7 @@ STM32F746G-DISCO-specific Configuration Options
CONFIG_SDIO_PRI - Select SDIO interrupt prority. Default: 128
CONFIG_SDIO_DMAPRIO - Select SDIO DMA interrupt priority.
Default: Medium
- CONFIG_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
+ CONFIG_STM32_SDIO_WIDTH_D1_ONLY - Select 1-bit transfer mode. Default:
4-bit transfer mode.
STM32 USB OTG FS Host Driver Support
diff --git a/drivers/mmcsd/mmcsd_sdio.c b/drivers/mmcsd/mmcsd_sdio.c
index 815854b3bb9..b91a534f546 100644
--- a/drivers/mmcsd/mmcsd_sdio.c
+++ b/drivers/mmcsd/mmcsd_sdio.c
@@ -128,6 +128,7 @@ struct mmcsd_state_s
uint8_t mode:2; /* (See MMCSDMODE_* definitions) */
uint8_t type:4; /* Card type (See MMCSD_CARDTYPE_* definitions) */
uint8_t buswidth:4; /* Bus widthes supported (SD only) */
+ sdio_capset_t caps; /* SDIO driver capabilities/limitations */
uint16_t selblocklen; /* The currently selected block length */
uint16_t rca; /* Relative Card Address (RCS) register */
@@ -2381,12 +2382,14 @@ static void mmcsd_mediachange(FAR void *arg)
static int mmcsd_widebus(FAR struct mmcsd_state_s *priv)
{
-#ifndef CONFIG_SDIO_WIDTH_D1_ONLY
int ret;
- /* Check if the SD card supports this feature (as reported in the SCR) */
+ /* Check if the SD card supports wide bus operation (as reported in the
+ * SCR or in the SDIO driver capabililities)
+ */
- if ((priv->buswidth & MMCSD_SCR_BUSWIDTH_4BIT) != 0)
+ if ((priv->buswidth & MMCSD_SCR_BUSWIDTH_4BIT) != 0 &&
+ (priv->caps & SDIO_CAPS_1BIT_ONLY) == 0)
{
/* Disconnect any CD/DAT3 pull up using ACMD42. ACMD42 is optional and
* need not be supported by all SD calls.
@@ -2453,13 +2456,6 @@ static int mmcsd_widebus(FAR struct mmcsd_state_s *priv)
fwarn("WARNING: Card does not support wide-bus operation\n");
return -ENOSYS;
-
-#else /* CONFIG_SDIO_WIDTH_D1_ONLY */
-
- finfo("Wide-bus operation is disabled\n");
- return -ENOSYS;
-
-#endif /* CONFIG_SDIO_WIDTH_D1_ONLY */
}
/****************************************************************************
@@ -3131,6 +3127,10 @@ static int mmcsd_hwinitialize(FAR struct mmcsd_state_s *priv)
mmcsd_takesem(priv);
+ /* Get the capabilities of the SDIO driver */
+
+ priv->caps = SDIO_CAPABILITIES(priv->dev);
+
#ifdef CONFIG_SDIO_DMA
/* Does this architecture support DMA with the MMC/SD device? */
diff --git a/include/nuttx/mmcsd.h b/include/nuttx/mmcsd.h
index 8d9c54b4719..15c0574d5a9 100644
--- a/include/nuttx/mmcsd.h
+++ b/include/nuttx/mmcsd.h
@@ -42,14 +42,6 @@
#include
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Types
- ****************************************************************************/
-
/****************************************************************************
* Public Functions
****************************************************************************/
diff --git a/include/nuttx/sdio.h b/include/nuttx/sdio.h
index 0a818e75d73..1fa67cfa29d 100644
--- a/include/nuttx/sdio.h
+++ b/include/nuttx/sdio.h
@@ -1,7 +1,7 @@
/****************************************************************************
* include/nuttx/sdio.h
*
- * Copyright (C) 2009, 2011-2013 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2009, 2011-2013, 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt
*
* Redistribution and use in source and binary forms, with or without
@@ -362,6 +362,28 @@
#define SDIO_RESET(dev) ((dev)->reset(dev))
+
+/****************************************************************************
+ * Name: SDIO_CAPABILITIES
+ *
+ * Description:
+ * Get capabilities (and limitations) of the SDIO driver (optional)
+ *
+ * Input Parameters:
+ * dev - Device-specific state data
+ *
+ * Returned Value:
+ * Returns a bitset of status values (see SDIO_CAPS_* defines)
+ *
+ ****************************************************************************/
+
+#define SDIO_CAPABILITIES(dev) \
+ (((dev)->status != NULL) ? (dev)->capabilities(dev) : 0)
+
+/* SDIO capability bits */
+
+#define SDIO_CAPS_1BIT_ONLY 0x01 /* Bit 0=1: Supports only 1-bit operation */
+
/****************************************************************************
* Name: SDIO_STATUS
*
@@ -820,6 +842,19 @@ enum sdio_clock_e
typedef uint8_t sdio_eventset_t;
+/* Capabilities set. A uint8_t is big enough to hold a set of
+ * 8-capabilities/limitations. If more are needed, change this to a
+ * uint16_t.
+ */
+
+typedef uint8_t sdio_capset_t;
+
+/* Status set. A uint8_t is big enough to hold a set of 8 status bits.
+ * If more are needed, change this to a uint16_t.
+ */
+
+typedef uint8_t sdio_statset_t;
+
/* This structure defines the interface between the NuttX SDIO driver and
* the chip- or board-specific SDIO interface. This interface is only used
* in architectures that support SDIO 1- or 4-bit data buses. For SDIO
@@ -842,7 +877,8 @@ struct sdio_dev_s
/* Initialization/setup */
void (*reset)(FAR struct sdio_dev_s *dev);
- uint8_t (*status)(FAR struct sdio_dev_s *dev);
+ sdio_capset_t (*capabilities)(FAR struct sdio_dev_s *dev);
+ sdio_statset_t (*status)(FAR struct sdio_dev_s *dev);
void (*widebus)(FAR struct sdio_dev_s *dev, bool enable);
void (*clock)(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate);
int (*attach)(FAR struct sdio_dev_s *dev);