Driver for SD/MMC cards (#239)
* Driver for SD/MMC cards * SDIO: read_register() bug fixed, schematics resized
This commit is contained in:
parent
b23dd64419
commit
2994a566a6
7 changed files with 829 additions and 0 deletions
98
extras/sdio/sdio.h
Normal file
98
extras/sdio/sdio.h
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
/*
|
||||
* Hardware SPI driver for MMC/SD/SDHC cards
|
||||
*
|
||||
* Part of esp-open-rtos
|
||||
* Copyright (C) 2016 Ruslan V. Uss <unclerus@gmail.com>
|
||||
* BSD Licensed as described in the file LICENSE
|
||||
*/
|
||||
#ifndef _EXTRAS_SDIO_H_
|
||||
#define _EXTRAS_SDIO_H_
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include "sdio_impl.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define SDIO_BLOCK_SIZE 512
|
||||
|
||||
typedef enum {
|
||||
SDIO_ERR_NONE = 0,
|
||||
SDIO_ERR_TIMEOUT,
|
||||
SDIO_ERR_UNSUPPORTED,
|
||||
SDIO_ERR_IO,
|
||||
SDIO_ERR_CRC
|
||||
} sdio_error_t;
|
||||
|
||||
typedef enum {
|
||||
SDIO_TYPE_UNKNOWN = 0,
|
||||
SDIO_TYPE_MMC,
|
||||
SDIO_TYPE_SD1,
|
||||
SDIO_TYPE_SD2,
|
||||
SDIO_TYPE_SDHC
|
||||
} sdio_card_type_t;
|
||||
|
||||
/**
|
||||
* SD card descriptor
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
sdio_error_t error; //!< Last operation result
|
||||
uint8_t cs_pin; //!< Chip Select GPIO pin
|
||||
sdio_card_type_t type; //!< Card type
|
||||
bool crc_enabled; //!< True if CRC enabled for IO
|
||||
sdio_ocr_t ocr; //!< OCR register
|
||||
sdio_csd_t csd; //!< CSD register
|
||||
sdio_cid_t cid; //!< CID register
|
||||
uint32_t sectors; //!< Card size in 512 byte sectors
|
||||
} sdio_card_t;
|
||||
|
||||
/**
|
||||
* \brief Init SD card
|
||||
* Device descriptor (registers, sectors count and so on) will be filled during initialization
|
||||
* SPI_FREQ_DIV_40M is good for modern SD cards, older SD can use SPI_FREQ_DIV_20M and lower
|
||||
* \param card Pointer to the device descriptor
|
||||
* \param cs_pin GPIO pin used for CS
|
||||
* \param high_freq_divider SPI bus frequency divider
|
||||
* \return Operation result
|
||||
*/
|
||||
sdio_error_t sdio_init(sdio_card_t *card, uint8_t cs_pin, uint32_t high_freq_divider);
|
||||
|
||||
/**
|
||||
* \brief Read 512 byte sectors from SD card
|
||||
* \param card Pointer to the device descriptor
|
||||
* \param sector Start sector
|
||||
* \param dst Receive buffer
|
||||
* \param count Number of sectors to read
|
||||
* \return Operation result
|
||||
*/
|
||||
sdio_error_t sdio_read_sectors(sdio_card_t *card, uint32_t sector, uint8_t *dst, uint32_t count);
|
||||
|
||||
/**
|
||||
* \brief Write 512 byte sectors to SD card
|
||||
* \param card Pointer to the device descriptor
|
||||
* \param sector Start sector
|
||||
* \param src Data to write
|
||||
* \param count Number of sectors to read
|
||||
* \return Operation result
|
||||
*/
|
||||
sdio_error_t sdio_write_sectors(sdio_card_t *card, uint32_t sector, uint8_t *src, uint32_t count);
|
||||
|
||||
/**
|
||||
* \brief Erase 512 byte sectors from SD card
|
||||
* \param card Pointer to the device descriptor
|
||||
* \param first First sector to erase
|
||||
* \param last Last sector to erase
|
||||
* \return Operation result
|
||||
*/
|
||||
sdio_error_t sdio_erase_sectors(sdio_card_t *card, uint32_t first, uint32_t last);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _EXTRAS_SDIO_H_ */
|
||||
Loading…
Add table
Add a link
Reference in a new issue