
#ifndef _MMC__H_
#define _MMC__H_

#include <stdint.h>

/*
 * Доступ к картам MMC/SD/SDHC
 *
 */

// Включение поддержки карт SDHC.
// Установить в 1 для поддержки SDHC карт память, т.е., SD-карт с более чем 2Гб памяти.
#define MMC_SDHC 						0

// Поддержка функции получения информации о карте 
// Если установлена в 1, будут доступны функция mmc_get_info() и структура mmc_info
#define MMC_SUPPORT_GET_INFO		1

// Поддержка функции чтения блока данных
// Если установлена в 1, будут доступна функция mmc_read_block()
#define MMC_SUPPORT_READ_BLOCK	1

// Поддержка функций побайтового чтения
// Если установлена в 1, будут доступны функции mmc_read_init(), mmc_read_done(), mmc_read_seek(), mmc_read_get()
#define MMC_SUPPORT_READ_BYTE		1





#define MMC_FORMAT_HARDDISK		0		// формат карты памяти подобен формату жесткого диска, она содержит mbr с таблицей разделов

#define MMC_FORMAT_SUPERFLOPPY	1		// карта содержит одну файловую систему баз таблицы разделов

#define MMC_FORMAT_UNIVERSAL		2		// карта соответствует стандарту Universal File Format.

#define MMC_FORMAT_UNKNOWN			3		// формат карты неизвестен


#if MMC_SDHC
	typedef uint64_t offset_t;
#else
	typedef uint32_t offset_t;
#endif



#if MMC_SUPPORT_GET_INFO
// cтруктура используется процедурой mmc_get_info() для возвращения информации о производителе и параметрах карты
struct mmc_info {
	uint8_t manufacturer;			// код производителя назначенный организацией SD
	uint8_t oem[3];					// a string describing the card's OEM or content, globally assigned by the SD card organization.
	uint8_t product[6];				// имя продукта
	uint8_t revision;					// код ревизии в BCD (например, значение 0x32 означает "3.2) 
	uint32_t serial;					// серийный номер назначенный производителем
	uint8_t manufacturing_year;	// год производства (отсчет от 2000)
	uint8_t manufacturing_month;	// месяц производства
	offset_t capacity;				// полная емкость в байтах
	uint8_t flag_copy;				// флаг того, что содержимое является копией (1-копия, 0-оригинал)
	uint8_t flag_write_protect;	// флаг защиты от записи (внутренний флаг, к состоянию переключателя защиты от записи отношения не имеет)
	uint8_t flag_write_protect_temp;	// флаг временной защиты от записи (внутренний флаг, к состоянию переключателя защиты от записи отношения не имеет)
	uint8_t format;					// формат карты (MMX_FORMAT_xxx)
};
#endif



	// иннициализирует работу с картой, определяет тип подключенной карты, вызывается при запуске
	uint8_t mmc_init();


#if MMC_SUPPORT_GET_INFO
	uint8_t mmc_get_info(struct mmc_info* info);
#endif


#if MMC_SUPPORT_READ_BLOCK
	// читает указанное количество байт с указанной позиции в буффер
	uint8_t mmc_read(offset_t offset, uint8_t* buffer, uintptr_t length);
#endif


#if MMC_SUPPORT_READ_BYTE
	// иннициализирует процесс последовательного побайтового чтения карты
	void mmc_read_init();

	// завершает процесс последовательного чтения карты
	void mmc_read_done();

	// позиционирует чтение на указанный байт
	void mmc_read_seek(offset_t offset);

	// читает и возвращает следующий байт
	uint8_t mmc_read_get();

	// читает и возвращает следующее слово
	uint16_t mmc_read_get_word();

	// читает и возвращает следующее двойное слово
	uint32_t mmc_read_get_dword();
#endif





#endif	// _MMC__H_

