1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Armink-SFUD

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

SFUD (Serial Flash Universal Driver)

Универсальное последовательное устройство управления флэш-памятью


0. Что такое SFUD?

SFUD — это открытая библиотека универсального последовательного драйвера для SPI Flash. Из-за большого разнообразия последовательных SPI Flash на рынке, существуют различия в спецификациях и командах между различными типами Flash. SFUD был разработан для решения этой проблемы и позволяет продуктам поддерживать различные типы и бренды Flash, что повышает возможность повторного использования и расширяемость программного обеспечения, связанного с Flash функциями, а также помогает избежать рисков, связанных с дефицитом или остановкой производства Flash.

Основные характеристики: поддержка интерфейсов SPI/QSPI, объектно-ориентированный подход (поддержка нескольких объектов Flash), гибкость и настраиваемость, поддержка 4-байтовых адресов.

Ресурсное потребление:

  • стандартное: RAM: 0,2 КБ, ROM: 5,5 КБ;
  • минимальное: RAM: 0,1 КБ, ROM: 3,6 КБ.

Концепция дизайна:

  • Что такое SFDP? Это стандарт параметров последовательной Flash функции, разработанный JEDEC (Ассоциацией твердотельной технологии). Последняя версия — V1.6B (см. здесь). Этот стандарт определяет наличие таблицы параметров в каждом типе Flash, которая содержит информацию о ёмкости, разрешении записи, командах стирания и режимах адресации Flash. В настоящее время большинство новых типов Flash поддерживают стандарт SFDP, за исключением некоторых старых моделей от определённых производителей. Библиотека SFUD будет пытаться использовать таблицу параметров SFDP при инициализации.
  • Как работать с типами Flash, которые не поддерживают SFDP? Если тип Flash не поддерживает стандарт SFDP, SFUD проверит конфигурационный файл (/sfud/inc/sfud_flash_def.h) на наличие информации о параметрах этого типа Flash. Если информация отсутствует, её можно добавить в конфигурационный файл (подробности см. в разделе 2.5 «Добавление поддержки для типов Flash, не поддерживаемых библиотекой»). После получения информации о параметрах Flash можно выполнять операции с этим типом Flash.

1. Почему стоит выбрать SFUD?

  • Избежание рисков, связанных с нехваткой Flash, остановкой их производства или расширением продуктов.
  • Всё больше проектов используют последовательную Flash для хранения данных, таких как прошивки ESP8266, BIOS материнских плат и другие. Разнообразие спецификаций и команд между разными типами Flash может создавать проблемы при адаптации к различным аппаратным платформам. Использование SFUD позволяет избежать этих проблем и повысить возможность повторного использования программного обеспечения.
  • Упрощение процесса разработки и снижение сложности. Теперь достаточно настроить SPI коммуникацию, чтобы начать работу с последовательной Flash.
  • Возможность создания инструментов для программирования и записи Flash.

2. Как использовать SFUD?

2.1 Работа с поддерживаемыми типами 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 общий размер данных для стирания, начиная с начального адреса

2.2.7 Стирание всех данных Flash-памяти

sfud_err sfud_chip_erase(const sfud_flash *flash)
Параметр Описание
flash Объект устройства Flash

2.2.8 Запись данных во Flash

sfud_err sfud_write(const sfud_flash *flash, uint32_t addr, size_t size, const uint8_t *data)
Параметр Описание
flash Объект устройства Flash
addr Начальный адрес
size Общий размер записываемых данных, начиная с начального адреса
data Данные для записи

2.2.9 Стирание и запись данных во Flash

Примечание: операция стирания будет выровнена по размеру блока стирания 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 Данные для записи

2.2.10 Чтение состояния Flash

sfud_err sfud_read_status(const sfud_flash *flash, uint8_t *status)
Параметр Описание
flash Объект устройства Flash
status Текущее значение регистра состояния

2.2.11 Запись (изменение) состояния Flash

sfud_err sfud_write_status(const sfud_flash *flash, bool is_volatile, uint8_t status)
Параметр Описание
flash Объект устройства Flash
is_volatile Является ли состояние энергозависимым, true: энергозависимое, при отключении питания данные будут потеряны
status Новое значение регистра состояния

2.3 Конфигурация

Все конфигурации находятся в /sfud/inc/sfud_cfg.h, пожалуйста, обратитесь к следующему описанию конфигурации и выберите конфигурацию, подходящую для вашего проекта.

2.3.1 Режим отладки

Включите или отключите определение макроса SFUD_DEBUG_MODE.

2.3.2 Использовать ли параметры SFDP

Включите или отключите определение макроса SFUD_USING_SFDP.

Примечание: после отключения будут доступны только данные о Flash из таблицы информации, предоставленной библиотекой в /sfud/inc/sfud_flash_def.h. Хотя это может снизить адаптируемость программного обеспечения, но уменьшит объём кода.

2.3.3 Использовать ли таблицу параметров Flash, предоставляемую библиотекой

Включите или отключите определение макроса SFUD_USING_FLASH_INFO_TABLE.

Примечание: после отключения библиотека будет поддерживать только Flash, соответствующие стандарту SFDP. Это также может уменьшить объём кода. По крайней мере один из двух макросов SFUD_USING_SFDP и SFUD_USING_FLASH_INFO_TABLE должен быть определён. Можно выбрать оба варианта.

2.3.4 Не использовать SFDP и не использовать таблицу параметров Flash

Чтобы ещё больше уменьшить объём кода, макросы 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);
......

2.3.5 Таблица устройств Flash

Если в продукте используется несколько 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() можно использовать для получения таблицы устройств, а затем использовать эти индексы для доступа к указанным устройствам.

2.3.6 Режим QSPI

Включите или отключите определение макроса SFUD_USING_QSPI.

После включения библиотека также будет поддерживать Flash, подключённые через шину QSPI.

2.4 Перенос

Файлы переноса находятся в /sfud/port/sfud_port.c, метод sfud_spi_port_init(sfud_flash *flash) в файле предоставляет переносимый метод, который завершает настройку каждого устройства SPI для чтения и записи (обязательно), количество повторных попыток (обязательно), интерфейс повторной попытки (необязательно) и блокировку SPI (необязательно). Для более подробного описания процесса переноса см. файлы переноса на каждой платформе в demo.

2.5 Добавление поддержки новых типов Flash

Здесь необходимо внести изменения... /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.

2.6 Demo

В настоящее время поддерживаются следующие платформы Demo:

Путь Описание платформы
/demo/stm32f10x_non_os Платформа STM32F10X без операционной системы
/demo/stm32f2xx_rtt Платформа STM32F2XX + RT-Thread операционной системы
/demo/stm32l475_non_os_qspi Платформа STM32L475 + QSPI режим без операционной системы

2.7 Лицензия

Используется открытый исходный код MIT, пожалуйста, ознакомьтесь с содержанием файла LICENSE в проекте.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Универсальная библиотека последовательного (SPI) флеш-драйвера, использующая стандарт JEDEC SFDP. Расширить Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://gitlife.ru/oschina-mirror/Armink-SFUD.git
git@gitlife.ru:oschina-mirror/Armink-SFUD.git
oschina-mirror
Armink-SFUD
Armink-SFUD
master