ELIOT1 HAL
Загрузка...
Поиск...
Не найдено
Драйвер модуля SDMMC

Драйвер SDMMC контроллера SD и MMC карт Подробнее...

Файлы

файл  hal_sdmmc.h
 Интерфейс драйвера модуля SDMMC.
 
файл  hal_sdmmc_cfg.h
 Интерфейс конфигурации модуля SDMMC.
 

Структуры данных

struct  sdmmc_card_t
 Контекст драйвера контроллера SDMMC. Подробнее...
 
struct  sdmmc_cfg_pin_map
 Конфигурация выводов контроллера SDMMC. Подробнее...
 
struct  sdmmc_port_cfg_t
 Конфигурация контроллера SDMMC. Подробнее...
 

Макросы

#define SDMMC_CALC_DIVIDER(input_freq_hz, required_freq_hz)   (((input_freq_hz) / (required_freq_hz)) / 2)
 Формула подсчета делителя выходной частоты контроллера SDMMC.
 

Перечисления

enum  sdmmc_status_t
 Статусы драйвера SDMMC. Подробнее...
 
enum  sdmmc_voltage_t
 Рабочие напряжения питания карты Подробнее...
 

Функции

sdmmc_status_t SDMMC_InitCard (sdmmc_card_t *sd, uint32_t num, sdmmc_voltage_t vol, void *init_buf)
 Инициализация SDMMC контроллера и вставленной карты SD или MMC.
 
void SDMMC_DisableCard (sdmmc_card_t *sd)
 Остановка SDMMC контроллера и выключение питания вставленной карты
 
sdmmc_status_t SDMMC_CalcMemorySpace (sdmmc_card_t *sd, void *sector_buf, bool unsafe)
 Подсчет размера пространства памяти карты
 
sdmmc_status_t SDMMC_Read (sdmmc_card_t *sd, uint32_t start_block, void *data, uint32_t nblocks)
 Чтение карты блоками размером 512 байт
 
sdmmc_status_t SDMMC_ReadAsync (sdmmc_card_t *sd, uint32_t start_block, void *data, uint32_t nblocks)
 Асинхронное чтение карты блоками размером 512 байт
 
sdmmc_status_t SDMMC_ReadWait (sdmmc_card_t *sd)
 Ожидание завершения операции асинхронного чтения памяти карты
 
sdmmc_status_t SDMMC_Write (sdmmc_card_t *sd, uint32_t start_block, const void *data, uint32_t nblocks)
 Запись карты блоками размером 512 байт
 
sdmmc_status_t SDMMC_WriteAsync (sdmmc_card_t *sd, uint32_t start_block, const void *data, uint32_t nblocks)
 Асинхронная запись карты блоками размером 512 байт
 
sdmmc_status_t SDMMC_WriteWait (sdmmc_card_t *sd)
 Ожидание завершения операции асинхронной записи памяти карты
 

Количество слотов под карты и их типы

enum  
 
#define SDMMC_IS_MMC(x)   ((x)->type == SDMMC_TypeMMC)
 
#define SDMMC_IS_SD(x)   ((x)->type == SDMMC_TypeSD)
 

Рабочие напряжения контроллера SDMMC

enum  
 

Направления передачи SDMA канала контроллера SDMMC

enum  
 

Типы и размеры ответов карты

enum  
 

Ширина шины данных карты в битах

enum  
 

Константы контроллера SDMMC

#define SDMMC_SDHC_SECTOR_SIZE   512
 
#define SDMMC_SD_SEND_IF_COND_PATTERN   0x1AA
 
#define SDMMC_SD_OCR_INIT_VALUE   0xFF80
 
#define SDMMC_MMC_RCA_ADDR   0x00010000
 
#define SDMMC_TIMEOUTCONTROL_MAX_VALUE   0xE
 

Типы слота карты контроллера SDMMC

#define SDMMC_CORECFG0_SLOTTYPE_REMOVABLE   0
 
#define SDMMC_CORECFG0_SLOTTYPE_EMBEDDED   1
 
#define SDMMC_CORECFG0_SLOTTYPE_SHARED_BUS   2
 

Режимы UHS-I карты SD

#define SDMMC_SD_UHS_MODE_DEFAULT_SDR12   0
 
#define SDMMC_SD_UHS_MODE_HIGHSPEED_SDR25   1
 
#define SDMMC_SD_UHS_MODE_SDR50   2
 
#define SDMMC_SD_UHS_MODE_SDR104   3
 
#define SDMMC_SD_UHS_MODE_DDR50   4
 

Выравнивание адреса буфера данных SDMA

Возможные варианты значений:

  • 0 - 4KB (Detects A11 Carry out)
  • 1 - 8KB (Detects A12 Carry out)
  • 2 - 16KB (Detects A13 Carry out)
  • 3 - 32KB (Detects A14 Carry out)
  • 4 - 64KB (Detects A15 Carry out)
  • 5 - 128KB (Detects A16 Carry out)
  • 6 - 256KB (Detects A17 Carry out)
  • 7 - 512KB (Detects A18 Carry out)
#define SDMMC_SDMA_ALIGN   0
 
#define SDMMC_SDMA_BLOCK_SIZE   (4096 << SDMMC_SDMA_ALIGN)
 
#define SDMMC_SDMA_BLOCK_ALIGN   __attribute__((aligned(SDMMC_SDMA_BLOCK_SIZE)))
 
#define SDMMC_SDMA_IS_BLOCK_ALIGN_ADDR(x)   (((uint32_t) (x) & (SDMMC_SDMA_BLOCK_SIZE - 1)) == 0)
 

Подробное описание

Драйвер SDMMC контроллера SD и MMC карт

Драйвер содержит функции инциализации карты, подсчета размера пространства памяти карты, синхронные и асинхронные операции чтения и записи карты.

Макросы

◆ SDMMC_CALC_DIVIDER

#define SDMMC_CALC_DIVIDER ( input_freq_hz,
required_freq_hz )   (((input_freq_hz) / (required_freq_hz)) / 2)

Формула подсчета делителя выходной частоты контроллера SDMMC.

Аргументы
input_freq_hzВходная частота контроллера SDMMC
required_freq_hzНеобходимая выходная частота контроллера SDMMC
Возвращает
Делитель частоты

◆ SDMMC_CORECFG0_SLOTTYPE_EMBEDDED

#define SDMMC_CORECFG0_SLOTTYPE_EMBEDDED   1

Встроеная карта

◆ SDMMC_CORECFG0_SLOTTYPE_REMOVABLE

#define SDMMC_CORECFG0_SLOTTYPE_REMOVABLE   0

Извлекаемая карта

◆ SDMMC_CORECFG0_SLOTTYPE_SHARED_BUS

#define SDMMC_CORECFG0_SLOTTYPE_SHARED_BUS   2

Разделяемая шина

◆ SDMMC_IS_MMC

#define SDMMC_IS_MMC ( x)    ((x)->type == SDMMC_TypeMMC)

Проверка на тип MMC

◆ SDMMC_IS_SD

#define SDMMC_IS_SD ( x)    ((x)->type == SDMMC_TypeSD)

Проверка на тип SD

◆ SDMMC_MMC_RCA_ADDR

#define SDMMC_MMC_RCA_ADDR   0x00010000

Относительный адрес MMC карты

◆ SDMMC_SD_OCR_INIT_VALUE

#define SDMMC_SD_OCR_INIT_VALUE   0xFF80

Значение OCR регистра при инициализации

◆ SDMMC_SD_SEND_IF_COND_PATTERN

#define SDMMC_SD_SEND_IF_COND_PATTERN   0x1AA

Начальный паттерн инициализации SD карты

◆ SDMMC_SD_UHS_MODE_DDR50

#define SDMMC_SD_UHS_MODE_DDR50   4

DDR50

◆ SDMMC_SD_UHS_MODE_DEFAULT_SDR12

#define SDMMC_SD_UHS_MODE_DEFAULT_SDR12   0

Default/SDR12

◆ SDMMC_SD_UHS_MODE_HIGHSPEED_SDR25

#define SDMMC_SD_UHS_MODE_HIGHSPEED_SDR25   1

HighSpeed/SDR25

◆ SDMMC_SD_UHS_MODE_SDR104

#define SDMMC_SD_UHS_MODE_SDR104   3

SDR104

◆ SDMMC_SD_UHS_MODE_SDR50

#define SDMMC_SD_UHS_MODE_SDR50   2

SDR50

◆ SDMMC_SDHC_SECTOR_SIZE

#define SDMMC_SDHC_SECTOR_SIZE   512

Размер сектора High Capacity карты

◆ SDMMC_SDMA_ALIGN

#define SDMMC_SDMA_ALIGN   0

Выравнивание адреса

◆ SDMMC_SDMA_BLOCK_ALIGN

#define SDMMC_SDMA_BLOCK_ALIGN   __attribute__((aligned(SDMMC_SDMA_BLOCK_SIZE)))

Атрибут GCC выравнивания по размеру блока SDMA

◆ SDMMC_SDMA_BLOCK_SIZE

#define SDMMC_SDMA_BLOCK_SIZE   (4096 << SDMMC_SDMA_ALIGN)

Размер блока данных SDMA в байтах

◆ SDMMC_SDMA_IS_BLOCK_ALIGN_ADDR

#define SDMMC_SDMA_IS_BLOCK_ALIGN_ADDR ( x)    (((uint32_t) (x) & (SDMMC_SDMA_BLOCK_SIZE - 1)) == 0)

Проверка выравнивания адреса по размеру блока данных SDMA

◆ SDMMC_TIMEOUTCONTROL_MAX_VALUE

#define SDMMC_TIMEOUTCONTROL_MAX_VALUE   0xE

Максимальное значение таймера ожидания сигнала на линиях DAT

Перечисления

◆ anonymous enum

anonymous enum
Элементы перечислений
SDMMC_TypeMMC 

Тип карты MMC

SDMMC_TypeSD 

Тип карты SD

◆ anonymous enum

anonymous enum
Элементы перечислений
SDMMC_HostPWR_3V3 

3,3 вольта

SDMMC_HostPWR_3V0 

3,0 вольта

SDMMC_HostPWR_1V8 

1,8 вольта

◆ anonymous enum

anonymous enum
Элементы перечислений
SDMMC_SDMA_TransferWrite 

Запись

SDMMC_SDMA_TransferRead 

Чтение

◆ anonymous enum

anonymous enum
Элементы перечислений
SDMMC_NoResponce 

Без ответа

SDMMC_ResponceLength136 

Длина ответа - 136 бит

SDMMC_ResponceLength48 

Длина ответа - 48 бит

SDMMC_ResponceLength48_Check 

Длина ответа - 48 бит с проверкой

◆ anonymous enum

anonymous enum
Элементы перечислений
SDMMC_DataBusTransferWidth_1Bit 

1 бит

SDMMC_DataBusTransferWidth_4bit 

4 бит

SDMMC_ExtDataBusTransferWidth_8bit 

8 бит

◆ sdmmc_status_t

Статусы драйвера SDMMC.

Элементы перечислений
SDMMC_Status_Ok 

Ошибок нет

SDMMC_Status_Err 

Ошибка исполнения

◆ sdmmc_voltage_t

Рабочие напряжения питания карты

Элементы перечислений
SDMMC_3v3 

3,3 В (для карт MMC и SD в режиме Default Speed или High Speed)

SDMMC_1v8 

1,8 В (для карт MMC)

SDMMC_3v3To1v8 

3,3 В с переключением на 1,8 В (для карт SD в режимах UHS-I)

Функции

◆ SDMMC_CalcMemorySpace()

sdmmc_status_t SDMMC_CalcMemorySpace ( sdmmc_card_t * sd,
void * sector_buf,
bool unsafe )

Подсчет размера пространства памяти карты

Подсчет общего пространства памяти карты через регистры параметров, если подсчет по параметрам не удался, то может применяться итеративный метод определения размера, но с повреждением информации на карте. Подсчитанный размер записыватся в поле total_size контекста sd в байтах.

Заметки
Буфер памяти для SDMA должен быть выровнен по границе блока SDMA и размером 512 байт.
Аргументы
sdКонтекст драйвера SDMMC
sector_bufБуфер памяти для SDMA
unsafeИспользовать (1) или не использовать (0) небезопасные методы определения емкости карты
Возвращаемые значения
SDMMC_Status_Ok
SDMMC_Status_Err

◆ SDMMC_DisableCard()

void SDMMC_DisableCard ( sdmmc_card_t * sd)

Остановка SDMMC контроллера и выключение питания вставленной карты

Аргументы
sdКонтекст драйвера SDMMC

◆ SDMMC_InitCard()

sdmmc_status_t SDMMC_InitCard ( sdmmc_card_t * sd,
uint32_t num,
sdmmc_voltage_t vol,
void * init_buf )

Инициализация SDMMC контроллера и вставленной карты SD или MMC.

Заметки
Буфер памяти для SDMA должен быть выровнен по границе блока SDMA и размером 512 байт.
Аргументы
sdКонтекст драйвера SDMMC
numНомер контроллера SDMMC
volВыбор напряжения питания карты
init_bufБуфер памяти для SDMA
Возвращаемые значения
SDMMC_Status_Ok
SDMMC_Status_Err

◆ SDMMC_Read()

sdmmc_status_t SDMMC_Read ( sdmmc_card_t * sd,
uint32_t start_block,
void * data,
uint32_t nblocks )

Чтение карты блоками размером 512 байт

Заметки
Буфер памяти для SDMA должен быть выровнен по границе блока SDMA.
Аргументы
sdКонтекст драйвера SDMMC
start_blockНомер первого блока памяти карты
dataБуфер памяти для SDMA
nblocksКоличество считываемых блоков памяти
Возвращаемые значения
SDMMC_Status_Ok
SDMMC_Status_Err

◆ SDMMC_ReadAsync()

sdmmc_status_t SDMMC_ReadAsync ( sdmmc_card_t * sd,
uint32_t start_block,
void * data,
uint32_t nblocks )

Асинхронное чтение карты блоками размером 512 байт

Заметки
Буфер памяти для SDMA должен быть выровнен по границе блока SDMA.
Аргументы
sdКонтекст драйвера SDMMC
start_blockНомер первого блока памяти карты
dataБуфер памяти для SDMA
nblocksКоличество считываемых блоков памяти
Возвращаемые значения
SDMMC_Status_Ok
SDMMC_Status_Err

◆ SDMMC_ReadWait()

sdmmc_status_t SDMMC_ReadWait ( sdmmc_card_t * sd)

Ожидание завершения операции асинхронного чтения памяти карты

Аргументы
sdКонтекст драйвера SDMMC
Возвращаемые значения
SDMMC_Status_Ok
SDMMC_Status_Err

◆ SDMMC_Write()

sdmmc_status_t SDMMC_Write ( sdmmc_card_t * sd,
uint32_t start_block,
const void * data,
uint32_t nblocks )

Запись карты блоками размером 512 байт

Заметки
Буфер памяти для SDMA должен быть выровнен по границе блока SDMA.
Аргументы
sdКонтекст драйвера SDMMC
start_blockНомер первого блока памяти карты
dataБуфер памяти для SDMA
nblocksКоличество записываемых блоков памяти
Возвращаемые значения
SDMMC_Status_Ok
SDMMC_Status_Err

◆ SDMMC_WriteAsync()

sdmmc_status_t SDMMC_WriteAsync ( sdmmc_card_t * sd,
uint32_t start_block,
const void * data,
uint32_t nblocks )

Асинхронная запись карты блоками размером 512 байт

Заметки
Буфер памяти для SDMA должен быть выровнен по границе блока SDMA.
Аргументы
sdКонтекст драйвера SDMMC
start_blockНомер первого блока памяти карты
dataБуфер памяти для SDMA
nblocksКоличество записываемых блоков памяти
Возвращаемые значения
SDMMC_Status_Ok
SDMMC_Status_Err

◆ SDMMC_WriteWait()

sdmmc_status_t SDMMC_WriteWait ( sdmmc_card_t * sd)

Ожидание завершения операции асинхронной записи памяти карты

Аргументы
sdКонтекст драйвера SDMMC
Возвращаемые значения
SDMMC_Status_Ok
SDMMC_Status_Err