diff --git a/ChangeLog b/ChangeLog index 246b693419..99708875bf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5801,3 +5801,6 @@ required. Implemented stm32_dmacapable for stm32f1xx devices. Enhanced stm32_dmacapable for stm32f2xx and stm32f4xx devices to check for additional conditions that will cause DMA to fail or lose data (2013-10-18). + * include/nuttx/sdio.h: Add a preflight method to the SDIO interface. + From Mike Smith (2013-10-18). + diff --git a/arch/arm/src/stm32/Kconfig b/arch/arm/src/stm32/Kconfig index 8458becbf6..e2322c627f 100644 --- a/arch/arm/src/stm32/Kconfig +++ b/arch/arm/src/stm32/Kconfig @@ -723,6 +723,7 @@ config STM32_SDIO default n depends on !STM32_CONNECTIVITYLINE && !STM32_VALUELINE select ARCH_HAVE_SDIO + select SDIO_PREFLIGHT config STM32_SPI1 bool "SPI1" diff --git a/include/nuttx/sdio.h b/include/nuttx/sdio.h index 186736e864..fddab8bbdb 100644 --- a/include/nuttx/sdio.h +++ b/include/nuttx/sdio.h @@ -1,7 +1,7 @@ /**************************************************************************** * include/nuttx/sdio.h * - * Copyright (C) 2009, 2011-2012 Gregory Nutt. All rights reserved. + * Copyright (C) 2009, 2011-2013 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -107,7 +107,7 @@ * -Addressed Command, R2 response 31:16=RCA */ # define MMCSD_CMDIDX10 10 /* SEND_CID: Asks card to send its card identification (CID) * -Addressed Command, R2 response 31:16=RCA */ -# define MMC_CMDIDX11 11 /* READ_DAT_UNTIL_STOP +# define MMC_CMDIDX11 11 /* READ_DAT_UNTIL_STOP * -Addressed data transfer command, R1 response 31:0=DADR */ # define MMCSD_CMDIDX12 12 /* STOP_TRANSMISSION: Forces the card to stop transmission * -Addressed Command, R1b response */ @@ -708,6 +708,30 @@ # define SDIO_DMASUPPORTED(dev) (false) #endif +/**************************************************************************** + * Name: SDIO_DMAPREFLIGHT + * + * Description: + * Preflight an SDIO DMA operation. If the buffer is not well-formed for + * SDIO DMA transfer (alignment, size, etc.) returns an error. + * + * Input Parameters: + * dev - An instance of the SDIO device interface + * buffer - The memory to DMA to/from + * buflen - The size of the DMA transfer in bytes + * + * Returned Value: + * OK on success; a negated errno on failure + * + ****************************************************************************/ + +#if defined(CONFIG_SDIO_DMA) && defined(CONFIG_SDIO_PREFLIGHT) +# define SDIO_DMAPREFLIGHT(dev,buffer,len) \ + ((dev)->dmapreflight?(dev)->dmapreflight(dev,buffer,len):OK) +#else +# define SDIO_DMAPREFLIGHT(dev,buffer,len) (OK) +#endif + /**************************************************************************** * Name: SDIO_DMARECVSETUP * @@ -848,6 +872,10 @@ struct sdio_dev_s #ifdef CONFIG_SDIO_DMA bool (*dmasupported)(FAR struct sdio_dev_s *dev); +#ifdef CONFIG_SDIO_PREFLIGHT + int (*dmapreflight)(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer, + size_t buflen); +#endif int (*dmarecvsetup)(FAR struct sdio_dev_s *dev, FAR uint8_t *buffer, size_t buflen); int (*dmasendsetup)(FAR struct sdio_dev_s *dev, FAR const uint8_t *buffer,