SFUD (Serial Flash Universal Driver)
Универсальное последовательное устройство управления флэш-памятью
SFUD — это открытая библиотека универсального последовательного драйвера для SPI Flash. Из-за большого разнообразия последовательных SPI Flash на рынке, существуют различия в спецификациях и командах между различными типами Flash. SFUD был разработан для решения этой проблемы и позволяет продуктам поддерживать различные типы и бренды Flash, что повышает возможность повторного использования и расширяемость программного обеспечения, связанного с Flash функциями, а также помогает избежать рисков, связанных с дефицитом или остановкой производства Flash.
Основные характеристики: поддержка интерфейсов SPI/QSPI, объектно-ориентированный подход (поддержка нескольких объектов Flash), гибкость и настраиваемость, поддержка 4-байтовых адресов.
Ресурсное потребление:
Концепция дизайна:
/sfud/inc/sfud_flash_def.h
) на наличие информации о параметрах этого типа Flash. Если информация отсутствует, её можно добавить в конфигурационный файл (подробности см. в разделе 2.5 «Добавление поддержки для типов Flash, не поддерживаемых библиотекой»). После получения информации о параметрах Flash можно выполнять операции с этим типом Flash.В таблице ниже представлены все типы Flash, успешно протестированные на демонстрационной платформе. Для типов Flash, отмеченных как «не поддерживающие» стандарт SFDP, информация уже определена в таблице параметров Flash, и требуется дальнейшее обновление и поддержка со стороны сообщества (GitHub, OSChina, Coding).
Если вы считаете этот проект полезным, можете поставить ему «лайк» на странице проекта (здесь) и рекомендовать его другим заинтересованным разработчикам.
Тип | Производитель | Ёмкость | Максимальная скорость | Поддержка SFDP | Режим QSPI | Примечание |
---|---|---|---|---|---|---|
W25Q40BV | Winbond | 4Mb | 50Mhz | Не поддерживается | Двухпроводный | Снято с производства |
W25Q80DV | Winbond | 8Mb | 104Mhz | Поддерживается | Двухпроводный | |
W25Q16BV | Winbond | 16Mb | 104Mhz | Не поддерживается | Двухпроводный | by slipperstree |
W25Q16CV | Winbond | 16Mb | 104Mhz | Поддерживается | ||
W25Q16DV | Winbond | 16Mb | 104Mhz | Поддерживается | by slipperstree | |
W25Q32BV | Winbond | 32Mb | 104Mhz | Поддерживается | Двухпроводный | |
W25Q64CV | Winbond | 64Mb | 80Mhz | Поддерживается | Четырёхпроводный | |
W25Q128BV | Winbond | 128Mb | 104Mhz | Поддерживается | Четырёхпроводный | |
W25Q256FV | Winbond | 256Mb | 104Mhz | Поддерживается | Четырёхпроводный | |
MX25L3206E | Macronix | 32Mb | 86MHz | Поддерживается | Двухпроводный | |
KH25L4006E | Macronix | 4Mb | 86Mhz | Поддерживается | Не тестировался | by [JiapengLi] |
KH25L3206E | Macronix | 32Mb | 86Mhz | Поддерживается | Двухпроводный | |
SST25VF016B | Microchip | 16Mb | 50MHz | Не поддерживается | Не поддерживается | SST была приобретена Microchip |
M25P40 | Micron | 4Mb | 75Mhz | Не поддерживается | Не тестировался | by [redocCheng] |
M25P80 | Micron | 8Mb | 75Mhz | Не поддерживается | Не тестировался | by [redocCheng] |
M25P32 | Micron | 32Mb | 75Mhz | Не поддерживается | ||
EN25Q32B | EON | 32Mb | 104MHz | Не поддерживается | Не тестировался | |
--------------------------------------- | ---------------------- | ---------- | -------- | ------------------ | ----------------- | ------------------------ |
GD25Q64B | ГигаДевайс | 64 Мб | 120 МГц | не поддерживает | двухлинейный | |
S25FL216K | Сайпрес | 16 Мб | 65 МГц | не поддерживает | двухлинейный | |
S25FL032P | Сайпрес | 32 Мб | 104 МГц | не поддерживает | не тестировано | от yc_911 (yc_911) |
S25FL164K | Сайпрес | 64 Мб | 108 МГц | поддерживает | не тестировано | |
A25L080 | АМИК | 8 Мб | 100 МГц | не поддерживает | двухлинейный | |
A25LQ64 | АМИК | 64 Мб | 104 МГц | поддерживает | поддерживает | |
F25L004 | ЭСМТ | 4 Мб | 100 МГц | не поддерживает | не поддерживает | |
PCT25VF016B | ПКТ Груп | 16 Мб | 80 МГц | не поддерживает | не поддерживает | с разрешения SST, будет распознаваться как SST25VF016B |
AT45DB161E | АДЕСТО | 16 Мб | 85 МГц | не поддерживает | не поддерживает | АДЕСТО приобрела линейку последовательных флэш-устройств Atmel |
2.2 API описание
Сначала давайте объясним основную структуру данных, используемую в этой библиотеке: sfud_flash. Она определена в файле /sfud/inc/sfud_def.h
. Каждый SPI Flash соответствует одному объекту структуры sfud_flash, который мы будем называть объектом Flash-устройства. После успешной инициализации в структуре sfud_flash->chip будут храниться общие параметры SPI Flash. Если SPI Flash также поддерживает SFDP, то через sfud_flash->sfdp можно увидеть более полную информацию о параметрах. Многие функции используют объект Flash-устройства в качестве первого аргумента для выполнения операций над указанным SPI Flash.
2.2.1 Инициализация библиотеки SFUD
Вызывается функция sfud_init(), которая инициализирует все устройства в таблице Flash-устройств. Если есть только один Flash, можно использовать только функцию sfud_device_init() для одиночной инициализации.
Примечание: после инициализации все SPI Flash по умолчанию отменяют защиту от записи. Если требуется включить защиту от записи, используйте функцию sfud_write_status для изменения состояния SPI Flash.
sfud_err sfud_init(void)
2.2.2 Инициализация указанного Flash-устройства
sfud_err sfud_device_init(sfud_flash *flash)
Параметр | Описание |
---|---|
flash | Flash-устройство, которое нужно инициализировать |
2.2.3 Включение режима быстрого чтения (доступно только после включения QSPI-режима в SFUD)
После включения QSPI-режима в SFUD, драйверы Flash в SFUD поддерживают использование QSPI-шины для связи. По сравнению с традиционным SPI-режимом, QSPI позволяет ускорить чтение данных из Flash, но поскольку данные записываются медленнее, чем скорость передачи SPI, ускорение скорости записи данных в QSPI-режиме не так заметно.
Поэтому поддержка QSPI в SFUD ограничивается только быстрым чтением. Эта функция позволяет настроить максимальную ширину фактической линии данных используемой QSPI-шиной, например, 1 линия (по умолчанию, т.е. традиционный SPI-режим), 2 линии или 4 линии.
После настройки SFUD будет использовать текущую настройку ширины линии QSPI для сопоставления наиболее подходящего и быстрого режима чтения, и пользователь сможет использовать QSPI-транспортировку при вызове функции sfud_read() для отправки команды.
sfud_err sfud_qspi_fast_read_enable(sfud_flash *flash, uint8_t data_line_width)
Параметр | Описание |
---|---|
flash | Flash-устройство |
data_line_width | Максимальная ширина линии данных QSPI-шины, например, 1, 2 или 4 |
2.2.4 Получение объекта Flash-устройства
В конфигурационном файле SFUD определяется таблица Flash-устройств, которая отвечает за хранение всех используемых объектов Flash-устройств. SFUD поддерживает одновременное управление несколькими Flash-устройствами. Конфигурация таблицы устройств находится в макросе SFUD_FLASH_DEVICE_TABLE
в файле /sfud/inc/sfud_cfg.h
, а метод конфигурации описан в разделе 2.3 Конфигурационные методы). Эта функция возвращает объект Flash-устройства на основе индекса Flash в таблице устройств. Если индекс выходит за пределы диапазона таблицы, возвращается NULL.
sfud_flash *sfud_get_device(size_t index)
Параметр | Описание |
---|---|
index | Индекс Flash в таблице Flash-устройств |
2.2.5 Чтение данных Flash
sfud_err sfud_read(const sfud_flash *flash, uint32_t addr, size_t size, uint8_t *data)
Параметр | Описание |
---|---|
flash | Объект Flash-устройства |
addr | Начальный адрес |
size | Общий размер данных для чтения начиная с начального адреса |
data | Данные, которые были прочитаны |
2.2.6 Стирание данных Flash
Обратите внимание: операция стирания будет выровнена по размеру блока стирания Flash-чипа (см. руководство по данным Flash, обычно это размер блока). После завершения инициализации вы можете проверить размер стирания через sfud_flash->chip.erase_gran
. Убедитесь, что начальный адрес и размер стираемых данных выровнены по размеру стирания Flash-чипа, иначе после операции стирания могут быть потеряны другие данные.
sfud_err sfud_erase(const sfud_flash *flash, uint32_t addr, size_t size)
Параметр | Описание |
---|---|
flash | Объект Flash-устройства |
size | общий размер данных для стирания, начиная с начального адреса |
sfud_err sfud_chip_erase(const sfud_flash *flash)
Параметр | Описание |
---|---|
flash | Объект устройства Flash |
sfud_err sfud_write(const sfud_flash *flash, uint32_t addr, size_t size, const uint8_t *data)
Параметр | Описание |
---|---|
flash | Объект устройства Flash |
addr | Начальный адрес |
size | Общий размер записываемых данных, начиная с начального адреса |
data | Данные для записи |
Примечание: операция стирания будет выровнена по размеру блока стирания Flash-чипа (см. руководство по данным Flash, обычно это размер блока). После инициализации можно проверить
sfud_flash->chip.erase_gran
. Убедитесь, что начальный адрес и размер стираемых данных выровнены по размеру блока стирания Flash-чипа, иначе после выполнения операции стирания могут быть потеряны другие данные.
sfud_err sfud_erase_write(const sfud_flash *flash, uint32_t addr, size_t size, const uint8_t *data)
Параметр | Описание |
---|---|
flash | Объект устройства Flash |
addr | Начальный адрес |
size | Общий размер записываемых данных, начиная с начального адреса |
data | Данные для записи |
sfud_err sfud_read_status(const sfud_flash *flash, uint8_t *status)
Параметр | Описание |
---|---|
flash | Объект устройства Flash |
status | Текущее значение регистра состояния |
sfud_err sfud_write_status(const sfud_flash *flash, bool is_volatile, uint8_t status)
Параметр | Описание |
---|---|
flash | Объект устройства Flash |
is_volatile | Является ли состояние энергозависимым, true: энергозависимое, при отключении питания данные будут потеряны |
status | Новое значение регистра состояния |
Все конфигурации находятся в /sfud/inc/sfud_cfg.h
, пожалуйста, обратитесь к следующему описанию конфигурации и выберите конфигурацию, подходящую для вашего проекта.
Включите или отключите определение макроса SFUD_DEBUG_MODE
.
Включите или отключите определение макроса SFUD_USING_SFDP
.
Примечание: после отключения будут доступны только данные о Flash из таблицы информации, предоставленной библиотекой в /sfud/inc/sfud_flash_def.h
. Хотя это может снизить адаптируемость программного обеспечения, но уменьшит объём кода.
Включите или отключите определение макроса SFUD_USING_FLASH_INFO_TABLE
.
Примечание: после отключения библиотека будет поддерживать только Flash, соответствующие стандарту SFDP. Это также может уменьшить объём кода. По крайней мере один из двух макросов SFUD_USING_SFDP
и SFUD_USING_FLASH_INFO_TABLE
должен быть определён. Можно выбрать оба варианта.
Чтобы ещё больше уменьшить объём кода, макросы SFUD_USING_SFDP
и SFUD_USING_FLASH_INFO_TABLE
можно не определять.
В этом случае при определении устройства Flash необходимо указать параметры Flash. Затем вызовите sfud_device_init
для инициализации устройства. Пример кода:
sfud_flash sfud_norflash0 = {
.name = "norflash0",
.spi.name = "SPI1",
.chip = { "W25Q64FV", SFUD_MF_ID_WINBOND, 0x40, 0x17, 8L * 1024L * 1024L, SFUD_WM_PAGE_256B, 4096, 0x20 } };
......
sfud_device_init(&sfud_norflash0);
......
Если в продукте используется несколько Flash, можно добавить таблицу устройств Flash. Измените определение макроса SFUD_FLASH_DEVICE_TABLE
, пример:
enum {
SFUD_W25Q64CV_DEVICE_INDEX = 0,
SFUD_GD25Q64B_DEVICE_INDEX = 1,
};
#define SFUD_FLASH_DEVICE_TABLE \
{ \
[SFUD_W25Q64CV_DEVICE_INDEX] = {.name = "W25Q64CV", .spi.name = "SPI1"}, \
[SFUD_GD25Q64B_DEVICE_INDEX] = {.name = "GD25Q64B", .spi.name = "SPI3"}, \
}
Определены два устройства Flash ("W25Q64CV"
и "GD25Q64B"
), соответствующие именам SPI-устройств "SPI1"
и "SPI3"
(используется при переносе интерфейса SPI, находится в /sfud/port/sfud_port.c
), SFUD_W25Q16CV_DEVICE_INDEX
и SFUD_GD25Q64B_DEVICE_INDEX
— индексы двух устройств в таблице устройств. Метод sfud_get_device_table()
можно использовать для получения таблицы устройств, а затем использовать эти индексы для доступа к указанным устройствам.
Включите или отключите определение макроса SFUD_USING_QSPI
.
После включения библиотека также будет поддерживать Flash, подключённые через шину QSPI.
Файлы переноса находятся в /sfud/port/sfud_port.c
, метод sfud_spi_port_init(sfud_flash *flash)
в файле предоставляет переносимый метод, который завершает настройку каждого устройства SPI для чтения и записи (обязательно), количество повторных попыток (обязательно), интерфейс повторной попытки (необязательно) и блокировку SPI (необязательно). Для более подробного описания процесса переноса см. файлы переноса на каждой платформе в demo.
Здесь необходимо внести изменения... /sfud/inc/sfdu_flash_def.h, все уже поддерживаемые Flash можно увидеть в макроопределении SFUD_FLASH_CHIP_TABLE. Необходимо заранее подготовить содержимое параметров Flash: | Наименование | Идентификатор производителя | Идентификатор типа | Идентификатор ёмкости | Ёмкость | Режим записи | Степень стирания (минимальная единица стирания) | Команда, соответствующая степени стирания | Здесь в качестве примера приводится добавление Flash от «GigaDevice» — GD25Q64B.
Этот тип Flash является ранним продуктом «GigaDevice», поэтому он не поддерживает стандарт SFDP. Сначала необходимо скачать его техническое описание, найти 3 идентификатора, возвращаемых командой 0x9F, здесь нужны последние два байта идентификатора — идентификатор типа и идентификатор ёмкости. Для GD25Q64B эти два идентификатора равны 0x40 и 0x17 соответственно. Остальные параметры Flash, требуемые выше, можно найти в техническом описании, здесь следует обратить особое внимание на параметр режим записи. Сама библиотека предоставляет 4 режима записи, см. перечисление sfud_write_mode в верхней части файла, один и тот же тип Flash может поддерживать несколько режимов записи в зависимости от ситуации. Для GD25Q64B поддерживаемый режим записи должен быть SFUD_WM_PAGE_256B, то есть запись по 1–256 байт на страницу. В сочетании с параметрами Flash GD25Q64B должно быть так:
{"GD25Q64B", SFUD_MF_ID_GIGADEVICE, 0x40, 0x17, 8*1024*1024, SFUD_WM_PAGE_256B, 4096, 0x20},
Затем добавьте его в конец макроопределения SFUD_FLASH_CHIP_TABLE, чтобы завершить поддержку библиотеки для GD25Q64B.
В настоящее время поддерживаются следующие платформы Demo:
Путь | Описание платформы |
---|---|
/demo/stm32f10x_non_os | Платформа STM32F10X без операционной системы |
/demo/stm32f2xx_rtt | Платформа STM32F2XX + RT-Thread операционной системы |
/demo/stm32l475_non_os_qspi | Платформа STM32L475 + QSPI режим без операционной системы |
Используется открытый исходный код MIT, пожалуйста, ознакомьтесь с содержанием файла LICENSE в проекте.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )