Перейти к содержанию

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 прямо предупреждает, что значения нужно программировать внимательно: например, установленный флаг запрета отладки снять уже невозможно.

Источники

  1. Raspberry Pi. RP2350 Datasheet — разд. 4.5 — 8 КБ OTP: заводская информация и уникальный идентификатор, настройки загрузки, например нестандартная частота кварца, отпечатки открытых ключей для проверки подписи, симметричные ключи для расшифровки флеш-памяти в SRAM, данные пользователя, в том числе загружаемые программы; 4096 строк по 24 бита — 16 бит данных и 8 бит контроля; биты изначально 0, их можно установить в 1, но сбросить нельзя ни при каких условиях, поэтому флаги безопасности вроде запрета отладки снять физически невозможно и значения нужно программировать внимательно; разд. 10.1.1 — загрузка в SRAM из содержимого OTP
  2. Espressif. ESP32-C6 Series Datasheet v1.5 — разд. 4.1.2.1 — eFuse 4096 бит, из них 1792 бита доступны пользователю

Нашли ошибку?