ATSHA204A — Lock Data
Переходим к следующему этапу работы с ATSHA204A — блокировке её Data и OTP зон (Lock Data). Это заключительный этап настройки и конфигурирования ATSHA204A, когда после внесения всех изменений в конфигурационную, Data и OTP зоны, микросхема полностью блокируется и переходит в свой основной режим работы.
В этой статье мы подробно разберём процедуру блокировки Lock Data и приведём код скетчей, который вы можете использовать в своих собственных проектах.
Состояние Extra байтов конфигурационной зоны
Конфигурационная зона микросхемы ATSHA204A содержит т. н. «Extra» байты, которые определяют состояние (Lock) как самой конфигурационной зоны (байт #87), так и её Data и OTP зон (байт #86). В изначальном состоянии оба эти байта имеют значение 0x55 и это значит, что эти зоны не заблокированы.
При блокировке зон соответствующий байт меняет своё значение с 0x55 на 0x00 и мы уже проводили подобную операцию с конфигурационной зоной (см. наши предыдущие статьи). Теперь нам предстоит изменить значение байта #86 конфигурационной зоны на 0x00.
Приведём текущее (без блокировки Lock Data) состояние конфигурационной зоны нашей микросхемы (воспользовавшись скетчем из одной из наших предыдущих статей).
Красным цветом выделен интересующий нас байт (#86), с которым мы и будем сегодня проводить манипуляции.
Порядок блокировки зон
Ещё раз напомним порядок работы с зонами памяти ATSHA204A. Общий принцип сводится к тому, что вначале мы устанавливаем необходимые нам настройки в конфигурационной зоне, затем блокируем конфигурационную зону и вносим нужные нам данные в Data и OTP зоны и затем блокируем их тоже и только после этого можем использовать ATSHA204A в своих устройствах.
Условно последовательность работы с ATSHA204A можно представить следующим образом:
- Запись Config зоны
- Блокировка Config зоны
- Запись Data зоны
- Запись OTP зоны
- Блокировка Data Lock
- Чтение Data/OTP
Ниже приведена таблица с наглядным представлением этапов блокировки различных зон памяти ATSHA204A и свойствами чтения/записи этих зон на различных этапах.
Первая строка таблицы — это начальное состояние ATSHA204A, когда конфигурационная зона не заблокирована и доступна для чтения и записи, а Data/OTP зоны недоступны ни для чтения, ни для записи.
Вторая строка — это состояние ATSHA204A после блокировки конфигурационной зоны. На этом этапе запись в эту зону заблокирована (за исключением Extra команд), а запись в зоны Data/OTP разрешена.
Третья строка — это состояние после Data Lock, когда становится возможным чтение из Data/OTP зон и частичная, в соответствии с установленными ранее правилами, запись в эти зоны.
Библиотека sha204_library
Как и в случае блокировки конфигурационной зоны (Lock Config), мы будем пользоваться библиотекой sha204_library, входящей в состав дистрибутива популярного проекта mySensors. Эта библиотека находится в папке
MySensors\examples\SecurityPersonalizer
дистрибутива и состоит из трёх файлов. Вам достаточно поместить эти файлы в папку со скетчем, который мы будем разбирать далее.
Скетч ATSHA204 Lock Data
Теперь приведём код скетча блокировки Data и OTP зон (Lock Data) микросхемы ATSHA204A, а затем подробнее рассмотрим его работу.
Обратите внимание: скетч не имеет предохранителей и если вы запустите его, то ваш экземпляр микросхемы ATSHA204A будет заблокирован! Используйте скетч только тогда, когда вы всё проверили и полностью уверены в своих действиях.
/* ATSHA204 Lock Data */ #include "sha204_library.h" #include "sha204_lib_return_codes.h" #define ATSHA204_PIN A3 byte bufTx[SHA204_CMD_SIZE_MAX]; byte bufRx[SHA204_RSP_SIZE_MAX]; byte lockData = 0; byte retCode = 0; atsha204Class sha204(ATSHA204_PIN); void setup() { Serial.begin(115200); Serial.println("ATSHA204 Lock Data start..."); lock(); Serial.print(F("Lock Data: 0x")); readConf(); Serial.print(lockData, HEX); } // Read byte addr(byte slot) { return slot * 4; } void readConf() { byte slot = 21; retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot)); lockData = bufRx[SHA204_BUFFER_POS_DATA + 2]; } // Write void lock() { retCode = sha204.sha204c_resync(SHA204_RSP_SIZE_MAX, bufRx); if (retCode != SHA204_SUCCESS && retCode != SHA204_RESYNC_WITH_WAKEUP) { Serial.println(F("Resync failed")); return; } retCode = sha204.sha204m_execute(SHA204_LOCK, SHA204_ZONE_OTP | LOCK_ZONE_NO_CRC, 0, 0, NULL, 0, NULL, 0, NULL, LOCK_COUNT, bufTx, LOCK_RSP_SIZE, bufRx); if (retCode == SHA204_SUCCESS) {Serial.println(F("Lock done"));} else {Serial.println(F("Lock failed"));} } // Loop void loop() { }
Вначале мы объявляем переменную lockData для чтения текущего состояния байта Lock Data (#86).
byte lockData = 0;
Логика работы скетча определяется в функции setup()
void setup() { Serial.begin(115200); Serial.println("ATSHA204 Lock Data start..."); lock(); Serial.print(F("Lock Data: 0x")); readConf(); Serial.print(lockData, HEX); }
Сначала мы проводим операцию изменения байта Lock Data.
lock();
А затем читаем состояние этого байта из памяти ATSHA204A и выводим его в Serial для контроля.
Serial.print(F("Lock Data: 0x")); readConf(); Serial.print(lockData, HEX);
Саму операцию по блокировке Data и OTP зон памяти производит функция lock()
void lock() { retCode = sha204.sha204c_resync(SHA204_RSP_SIZE_MAX, bufRx); if (retCode != SHA204_SUCCESS && retCode != SHA204_RESYNC_WITH_WAKEUP) { Serial.println(F("Resync failed")); return; } retCode = sha204.sha204m_execute(SHA204_LOCK, SHA204_ZONE_OTP | LOCK_ZONE_NO_CRC, 0, 0, NULL, 0, NULL, 0, NULL, LOCK_COUNT, bufTx, LOCK_RSP_SIZE, bufRx); if (retCode == SHA204_SUCCESS) {Serial.println(F("Lock done"));} else {Serial.println(F("Lock failed"));} }
где вначале производится проверка связи с чипом ATSHA204A
retCode = sha204.sha204c_resync(SHA204_RSP_SIZE_MAX, bufRx); if (retCode != SHA204_SUCCESS && retCode != SHA204_RESYNC_WITH_WAKEUP) { Serial.println(F("Resync failed")); return; }
и затем функцией sha204.sha204m_execute(), с соответствующими параметрами, производится операция блокировки.
retCode = sha204.sha204m_execute(SHA204_LOCK, SHA204_ZONE_OTP | LOCK_ZONE_NO_CRC, 0, 0, NULL, 0, NULL, 0, NULL, LOCK_COUNT, bufTx, LOCK_RSP_SIZE, bufRx);
После чего проверяется и выводится в Serial результат проведённой операции.
if (retCode == SHA204_SUCCESS) {Serial.println(F("Lock done"));} else {Serial.println(F("Lock failed"));}
И в завершение функцией readConf() производится, ставшая уже стандартной для нас, операция чтения данных из конфигурационной зоны ATSHA204A.
void readConf() { byte slot = 21; retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot)); lockData = bufRx[SHA204_BUFFER_POS_DATA + 2]; }
Вот результат работы скетча с сообщением об успешной блокировке Data и OTP зон памяти нашего экземпляра ATSHA204A. На всякий случай напомним, что блокировка (Lock) зон в ATSHA204A — это необратимая операция и разблокировать их обратно невозможно никакими средствами. Как вы понимаете, это сделано специально для обеспечения безопасности работы ATSHA204A.
Обратите внимание, в отличие от процедуры блокировки конфигурационной зоны из наших прошлых статей, в этом скетче мы вызывали функцию sha204.sha204m_execute() с флагом блокировки зоны без проверки CRC контрольной суммы данных.
SHA204_ZONE_OTP | LOCK_ZONE_NO_CRC, 0,
Состояние конфигурационной зоны после блокировки
Теперь воспользуемся скетчем их наших предыдущих статей и проверим состояние конфигурационной зоны нашего экземпляра ATSHA204A после блокировки всех (Config, Data, OTP) зон её памяти.
Вот скриншот финального состояния конфигурационной зоны:
Красным отмечен байт #86 Lock Data, который теперь равен 0x00 (как и байт #87 Lock Config). Наша микросхема полностью сконфигурирована и заблокирована и может приступать к основному режиму работы.
Заключение
В этой статье мы рассмотрели важный этап работы с ATSHA204A — блокировку её Data и OTP зон памяти (Lock Data). В следующей статье мы рассмотрим работу с ATSHA204A в «боевом» режиме со всеми заблокированными зонами памяти, рассмотрим операции чтения из Data и OTP зон, которые ранее были недоступны (до финальной блокировки).
Ссылки по теме
ATSHA204 - Библиотека и примеры
ATSHA204A - Чтение зоны конфигурации 1
ATSHA204A - Чтение зоны конфигурации 2
ATSHA204A - Чтение зоны конфигурации 3
ATSHA204A - Запись конфигурации 1
ATSHA204A - Запись конфигурации 2
ATSHA204A - Запись конфигурации 3
ATSHA204A - Запись конфигурации 4
ATSHA204A - Работа в режиме Config Lock
ATSHA204A - Работа с зонами памяти
ATSHA204A - Чтение Data и OTP зон памяти
ATSHA204A - Аутентификация. Базовый блок
ATSHA204A - Аутентификация. Датчик
ATSHA204A - Криптография и команды
ATSHA204A - nRF24 аутентификация. База
ATSHA204A - nRF24 аутентификация. Датчик