blob: c5aea80c312865614eb665d5bad2f5a3d3b71e15 [file] [log] [blame]
/* ----------------------------------------------------------------------------
* SAM Software Package License
* ----------------------------------------------------------------------------
* Copyright (c) 2015, Atmel Corporation
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the disclaimer below.
*
* Atmel's name may not be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ----------------------------------------------------------------------------
*/
#ifndef _SDMMC_PERIPH_H_
#define _SDMMC_PERIPH_H_
/*----------------------------------------------------------------------------
* Headers
*----------------------------------------------------------------------------*/
#include "chip.h"
#ifdef __cplusplus
extern "C" {
#endif
struct _SdmmcCommand;
/*----------------------------------------------------------------------------
* Definitions
*----------------------------------------------------------------------------*/
/* This structure is private to the SDMMC Driver.
* Allocate it but ignore its members. */
struct sdmmc_set
{
uint32_t id; /* SDMMC peripheral ID (ID_SDMMCx) */
Sdmmc *regs; /* set of SDMMC hardware registers */
uint32_t tc_id; /* Timer/Counter peripheral ID (ID_TCx) */
TcChannel *timer; /* set of TC channel hardware registers */
uint32_t *table; /* ADMA descriptor table, or NULL when DMA
* is not used */
uint32_t table_size; /* Max size of the ADMA descriptor table,
* in lines */
bool use_polling; /* polling mode */
bool use_set_blk_cnt; /* implicit SET_BLOCK_COUNT command */
uint16_t blk_size; /* max data block size, in bytes */
uint32_t dev_freq; /* frequency of clock provided to memory
* device, in Hz */
volatile uint8_t state;
struct _SdmmcCommand *cmd; /* pointer to the command being processed */
uint16_t blk_index; /* count of data blocks tranferred already,
* in the context of the command and data
* transfer being executed */
uint8_t resp_len; /* size of the response, once retrieved,
* in the context of the command being
* executed, expressed in 32-bit words */
bool expect_auto_end; /* waiting for completion of Auto CMD12 */
};
/*----------------------------------------------------------------------------
* Exported functions
*----------------------------------------------------------------------------*/
/**
* \brief Initialize the specified driver instance and the associated SDMMC
* peripheral.
* \param set Pointer to uninitialized driver instance data.
* \param regs Base address of registers of the SDMMC peripheral.
* \param sdmmc_id SDMMC peripheral ID (ID_SDMMCx).
* \param tc_id TC peripheral ID (ID_TCx).
* \note The application shall have enabled the clock assigned to this
* Timer/Counter peripheral.
* \param tc_ch TC channel number, within the Timer/Counter module designated
* by tc_id. Every instance of the SDMMC Driver requires a Timer/Counter channel
* for its exclusive usage.
* \param dma_buf Buffer allocated by the application, required when DMA is
* used. This is where the DMA descriptor table will be set up. The larger
* the buffer is, the greater throughput we achieve. Up to 4 KiB. Shall be
* word-aligned. NULL to have the CPU read/write data, word by word.
* \param dma_buf_size Size of the dma_buf buffer, in words.
* \return true if successful, false if a parameter is assigned an unsupported
* value.
*/
bool sdmmc_initialize(struct sdmmc_set *set, Sdmmc *regs, uint32_t sdmmc_id,
uint32_t tc_id, uint32_t tc_ch, uint32_t *dma_buf, uint32_t dma_buf_size);
#ifdef __cplusplus
}
#endif
#endif /* #ifndef _SDMMC_PERIPH_H_ */