Работа с последовательным ПЗУ (SPI Flash)
В оболочке U-Boot для работы с SPI Flash предназначена команда sf.
Команда sf используется для доступа к флэш-памяти SPI, поддерживает чтение, запись, стирание
и некоторые другие функции.
Help этой команды выглядит так:
=> help
sf
sf - SPI flash sub-system
Usage:
sf probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus
and chip select
sf read addr offset|partition len - read 'len' bytes starting at
'offset' or from start of mtd 'partition'to memory at 'addr'
sf write addr offset|partition len - write 'len' bytes from memory
at addr to flash at 'offset' or to start of mtd 'partition'
sf erase offset|partition [+]len - erase 'len' bytes from 'offset'
or from start of mtd 'partition' +'len' round up 'len' to block size
sf update addr offset|partition len - erase and write 'len' bytes from memory
at 'addr' to flash at 'offset' or to start of mtd 'partition'
sf protect lock/unlock sector len - protect/unprotect 'len' bytes starting
at address 'sector'
=>
probe
Флэш-память должна быть сначала проверена с помощью sf probe, прежде чем можно будет
использовать любую другую подкоманду. Все параметры являются необязательными:
bus - номер шины SPI, содержащий чип SPI-flash, например 0.
Если вы не знаете номер, вы можете использовать «dm uclass», чтобы увидеть
все устройства spi, и проверить значение «seq» для каждого из них (здесь 0 и 2):
uclass 89: spi
0 spi@0 @ 05484960, seq 0
1 spi@1 @ 05484b40, seq 2
cs - выбор микросхемы SPI для использования с микросхемой.
Часто это 0, и его можно опустить, но в некоторых случаях к контроллеру
SPI подключено несколько ведомых устройств, выбранных для каждого из них
линией выбора микросхемы.
hz - скорость (тактовая частота) шины SPI в герцах. Обычно это значение по умолчанию равно 100000,
то есть 100 кГц, что очень медленно. Обратите внимание, что если устройство существует в дереве устройств,
там может быть указана скорость, и в этом случае этот параметр игнорируется.
mode - режим использования SPI (0-3):
0 CPOL=0, CPHA=0
1 CPOL=0, CPHA=1
2 CPOL=1, CPHA=0
3 CPOL=1, CPHA=1
Clock phase (CPHA) - фаза тактового сигнала
Clock polarity (CPOL) - полярность тактового сигнала, управляет состоянием холостого хода
CPHA = 0 - данные передаются (выборка) по переднему фронту тактового сигнала
CPHA = 1 - данные передаются (выборка) по заднему фронту тактового сигнала
CPOL = 0 — низкий уровень, CPOL = 1 — высокий уровень
Другие параметры:
addr - адрес в оперативной памяти для начала передачи
offset - смещение в флэш-памяти для начала передачи
partition - если параметр не является числовым, предполагается,
что он является описанием раздела в формате ,,
который здесь не рассматривается. Для этого требуется сборка с CONFIG_CMD_MTDPARTS
len - количество байтов для передачи
Read
sf read используется для чтения из флэш-памяти SPI в память. Чтение завершится ошибкой,
если будет предпринята попытка чтения за пределами флэш-памяти.
Write
sf write используется для записи из памяти во флэш-память SPI.
Флэш-память SPI должна быть стерта в первую очередь, так как в противном случае
результат не будет определен. Запись завершится ошибкой, если будет предпринята
попытка записи за пределами флэш-памяти.
Erase
sf erase используется, чтобы стереть область флэш-памяти SPI.
Стирание не удастся, если какая-либо часть стираемой области защищена или находится
за концом флэш-памяти. Также может произойти сбой, если начальное смещение или длина
не выровнены по области стирания (например, 256 байт).
Update
sf update используется для автоматического стирания и обновления области
флэш-памяти SPI из ореративной памяти. Это работает по секторам за раз (обычно 4 КБ или 64 КБ).
Для каждого сектора сначала проверяется, есть ли в этом секторе правильные данные.
Если да, то он пропускается. Если нет, то сектор стирается и записываются новые данные.
Обратите внимание, что если длина не кратна размеру стирания, пространство после
данных в последнем секторе будет стерто. Если смещение не начинается в начале блока
стирания, операция завершится ошибкой.
Protect
Микросхемы SPI-Flash часто имеют функцию защиты, при которой микросхема разделена
на области, которые можно заблокировать или разблокировать.
С помощью sf protect эти настройки можно изменить, если они поддерживаются драйвером.
lock | unlock - выбирает блокировку или разблокировку секторов
sector - номер начального сектора для блокировки/разблокировки.
Это может быть смещение в байтах или другое значение, в зависимости от чипа.
len - количество байтов для блокировки/разблокировки
Test
Удобная и быстрая подкоманда sf test позволяет проверить, работает ли память
SPI Flash должным образом. Это работает в четыре этапа:
- erase - стирает всю область
- check - проверяет, что регион стерт
- write - записывает в регион тестовый паттерн, состоящий из кода U-Boot
- read — считывает тестовый шаблон, чтобы проверить, правильно ли он написан
Память выделяется для двух буферов, каждый размером байт.
Типичный размер составляет от 64 КБ до 1 МБ. Смещение и размер должны быть выровнены по границе стирания.
Обратите внимание, что этот тест не будет пройден, если какая-либо часть флэш-памяти SPI защищена от записи.
Примечание. В данной версии U-Boot sf help не показывает наличие sf test,
видимо, эта функция здесь не реализована, т.к. её выполнение прямо из SPI приведет к затиранию
загрузчика.