/* ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, 2011 Giovanni Di Sirio. This file is part of ChibiOS/RT. ChibiOS/RT is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. ChibiOS/RT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /** * @file STM32/sdc_lld.h * @brief STM32 SDC subsystem low level driver header. * * @addtogroup SDC * @{ */ #ifndef _SDC_LLD_H_ #define _SDC_LLD_H_ #if HAL_USE_SDC || defined(__DOXYGEN__) /*===========================================================================*/ /* Driver constants. */ /*===========================================================================*/ /*===========================================================================*/ /* Driver pre-compile time settings. */ /*===========================================================================*/ /** * @name Configuration options * @{ */ /** * @brief SDIO data timeout in SDIO clock cycles. */ #if !defined(STM32_SDC_DATATIMEOUT) || defined(__DOXYGEN__) #define STM32_SDC_DATATIMEOUT 0x000FFFFF #endif /** * @brief SDIO DMA priority (0..3|lowest..highest). */ #if !defined(STM32_SDC_SDIO_DMA_PRIORITY) || defined(__DOXYGEN__) #define STM32_SDC_SDIO_DMA_PRIORITY 3 #endif /** * @brief SDIO interrupt priority level setting. */ #if !defined(STM32_SDC_SDIO_IRQ_PRIORITY) || defined(__DOXYGEN__) #define STM32_SDC_SDIO_IRQ_PRIORITY 9 #endif /** * @brief SDIO support for unaligned transfers. */ #if !defined(STM32_SDC_UNALIGNED_SUPPORT) || defined(__DOXYGEN__) #define STM32_SDC_UNALIGNED_SUPPORT TRUE #endif /** @} */ /*===========================================================================*/ /* Derived constants and error checks. */ /*===========================================================================*/ #if !STM32_HAS_SDIO #error "SDIO not present in the selected device" #endif #if !defined(STM32_DMA_REQUIRED) #define STM32_DMA_REQUIRED #endif /* * SDIO clock divider. */ #if STM32_HCLK > 48000000 #define STM32_SDIO_DIV_HS 0x01 #define STM32_SDIO_DIV_LS 0xB2 #else #define STM32_SDIO_DIV_HS 0x00 #define STM32_SDIO_DIV_LS 0x76 #endif /*===========================================================================*/ /* Driver data structures and types. */ /*===========================================================================*/ /** * @brief Type of SDIO bus mode. */ typedef enum { SDC_MODE_1BIT = 0, SDC_MODE_4BIT, SDC_MODE_8BIT } sdcbusmode_t; /** * @brief Type of card flags. */ typedef uint32_t sdcmode_t; /** * @brief Type of a structure representing an SDC driver. */ typedef struct SDCDriver SDCDriver; /** * @brief Driver configuration structure. * @note It could be empty on some architectures. */ typedef struct { uint32_t dummy; } SDCConfig; /** * @brief Structure representing an SDC driver. */ struct SDCDriver { /** * @brief Driver state. */ sdcstate_t state; /** * @brief Current configuration data. */ const SDCConfig *config; /** * @brief Various flags regarding the mounted card. */ sdcmode_t cardmode; /** * @brief Card CID. */ uint32_t cid[4]; /** * @brief Card CSD. */ uint32_t csd[4]; /** * @brief Card RCA. */ uint32_t rca; /* End of the mandatory fields.*/ /** * @brief Thread waiting for I/O completion IRQ. */ Thread *thread; }; /*===========================================================================*/ /* Driver macros. */ /*===========================================================================*/ /*===========================================================================*/ /* External declarations. */ /*===========================================================================*/ #if !defined(__DOXYGEN__) extern SDCDriver SDCD1; #endif #ifdef __cplusplus extern "C" { #endif void sdc_lld_init(void); void sdc_lld_start(SDCDriver *sdcp); void sdc_lld_stop(SDCDriver *sdcp); void sdc_lld_start_clk(SDCDriver *sdcp); void sdc_lld_set_data_clk(SDCDriver *sdcp); void sdc_lld_stop_clk(SDCDriver *sdcp); void sdc_lld_set_bus_mode(SDCDriver *sdcp, sdcbusmode_t mode); void sdc_lld_send_cmd_none(SDCDriver *sdcp, uint8_t cmd, uint32_t arg); bool_t sdc_lld_send_cmd_short(SDCDriver *sdcp, uint8_t cmd, uint32_t arg, uint32_t *resp); bool_t sdc_lld_send_cmd_short_crc(SDCDriver *sdcp, uint8_t cmd, uint32_t arg, uint32_t *resp); bool_t sdc_lld_send_cmd_long_crc(SDCDriver *sdcp, uint8_t cmd, uint32_t arg, uint32_t *resp); bool_t sdc_lld_read(SDCDriver *sdcp, uint32_t startblk, uint8_t *buf, uint32_t n); bool_t sdc_lld_write(SDCDriver *sdcp, uint32_t startblk, const uint8_t *buf, uint32_t n); bool_t sdc_lld_is_card_inserted(SDCDriver *sdcp); bool_t sdc_lld_is_write_protected(SDCDriver *sdcp); #ifdef __cplusplus } #endif #endif /* HAL_USE_SDC */ #endif /* _SDC_LLD_H_ */ /** @} */