OTP-память (однократно программируемая)
Некоторые данные микроконтроллер должен хранить так, чтобы их нельзя было стереть: уникальный номер, ключи шифрования, запрет отладки. Для этого есть однократно программируемая память — бит в ней можно установить, но нельзя сбросить.
Обновлено Редакция GAW
OTP-память (one-time programmable, однократно программируемая) — энергонезависимая память, в которой каждый бит можно установить только один раз. Изначально все биты равны 0; запрограммированный бит становится 1 и больше не может вернуться в 0. Это свойство и делает OTP полезной: то, что записано в неё, уже не изменить ни программой, ни отладчиком.
Что в ней хранят. По даташиту RP2350 его 8 КБ OTP содержат:
- заводскую информацию и уникальный идентификатор чипа;
- настройки загрузки — например, нестандартную частоту кварца;
- отпечатки открытых ключей для безопасной загрузки;
- ключи для расшифровки флеш-памяти;
- данные пользователя и даже небольшие программы: загрузчик умеет загрузить их из OTP в оперативную память и запустить.
Память RP2350 устроена как 4096 строк по 24 бита: 16 бит данных и 8 бит контроля. Raspberry Pi подчёркивает, что флаги безопасности вроде запрета отладки после установки невозможно снять физически — поэтому значения нужно программировать очень внимательно.
eFuse. У Espressif аналогичная память называется eFuse. У ESP32-C6 её 4096 бит, из них 1792 доступны пользователю. Выводы и возможности самого RP2350 — на странице «RP2350: выводы чипа и функции GPIO».
Частые вопросы
Что такое OTP-память?
One-time programmable — однократно программируемая память. Бит в ней изначально равен 0, его можно один раз установить в 1, но обратно сбросить нельзя. В ней хранят то, что должно остаться навсегда: идентификатор чипа, ключи, настройки безопасности.
Чем OTP отличается от eFuse?
По сути ничем: eFuse — так Espressif называет биты однократно программируемой памяти своих чипов. У ESP32-C6, например, 4096 бит eFuse, из них 1792 доступны пользователю. Raspberry Pi называет аналогичную память RP2350 просто OTP — у неё 8 КБ.
Можно ли ошибиться при записи OTP?
Да, и исправить это нельзя: записанный бит не сбрасывается. Raspberry Pi прямо предупреждает, что значения нужно программировать внимательно: например, установленный флаг запрета отладки снять уже невозможно.
Источники
- Raspberry Pi. RP2350 Datasheet — разд. 4.5 — 8 КБ OTP: заводская информация и уникальный идентификатор, настройки загрузки, например нестандартная частота кварца, отпечатки открытых ключей для проверки подписи, симметричные ключи для расшифровки флеш-памяти в SRAM, данные пользователя, в том числе загружаемые программы; 4096 строк по 24 бита — 16 бит данных и 8 бит контроля; биты изначально 0, их можно установить в 1, но сбросить нельзя ни при каких условиях, поэтому флаги безопасности вроде запрета отладки снять физически невозможно и значения нужно программировать внимательно; разд. 10.1.1 — загрузка в SRAM из содержимого OTP
- Espressif. ESP32-C6 Series Datasheet v1.5 — разд. 4.1.2.1 — eFuse 4096 бит, из них 1792 бита доступны пользователю
Нашли ошибку?
Смотрите также
- eFuse и OTPОднократно программируемые биты: настройки, ключи, калибровка
- Безопасная загрузкаЗапуск только подписанной прошивки: подпись, ключи в OTP, откат версий
- Шифрование флеш-памятиПрошивка во внешней памяти в зашифрованном виде: XTS-AES, ключи в чипе
- RP2350: выводы и функции GPIO30 или 48 GPIO: выводы QFN-60 и QFN-80, функции F0–F11, АЦП, 5 В, токи