Сделали устройство на плате Arduino Zero в ней стоит контроллер SAMD21G18A.
И вот встал вопрос как закрыть кристалл от копирования. В стандартной среде разработки "Microchip Studio 7" (Atmel Studio) есть раздел с возможностью Установки "Security Bit" блокирующего копирование кристалла
Проделав указанную операцию я с удивлением понял, что в случае с Arduino механизм НЕ работает.
Кристалл после прошивки снова открыт и отлично копируется.
Решение было найдено здесь : Code protection for SAMD21G18A
В случае с контроллером SAMD21 имеют место команды С++ которыми мы можем устанавливать Fusese в нужное состояние.
Метод я проверил и он действительно работает.
P.S. Было бы неплохо увидеть все доступные команды для работы с FUSES.
void setup() {
uint32_t ctrlb_bak = NVMCTRL->CTRLB.reg; // Turn off cache before issuing flash commands
NVMCTRL->CTRLB.reg = ctrlb_bak | NVMCTRL_CTRLB_CACHEDIS;
NVMCTRL->STATUS.reg = NVMCTRL_STATUS_MASK; // Clear error flags
if (!(NVMCTRL->INTFLAG.reg & NVMCTRL_INTFLAG_READY)) // Check if the module is busy
{
NVMCTRL->CTRLB.reg = ctrlb_bak; // Restore the setting
} else {
NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMD_SSB | // Set command
NVMCTRL_CTRLA_CMDEX_KEY;
while (!(NVMCTRL->INTFLAG.reg & NVMCTRL_INTFLAG_READY)) {} // Wait for the NVM controller to become ready
NVMCTRL->CTRLB.reg = ctrlb_bak; // Restore the setting
}
}
void loop() { }
И вот встал вопрос как закрыть кристалл от копирования. В стандартной среде разработки "Microchip Studio 7" (Atmel Studio) есть раздел с возможностью Установки "Security Bit" блокирующего копирование кристалла
Проделав указанную операцию я с удивлением понял, что в случае с Arduino механизм НЕ работает.
Кристалл после прошивки снова открыт и отлично копируется.
Решение было найдено здесь : Code protection for SAMD21G18A
В случае с контроллером SAMD21 имеют место команды С++ которыми мы можем устанавливать Fusese в нужное состояние.
Метод я проверил и он действительно работает.
P.S. Было бы неплохо увидеть все доступные команды для работы с FUSES.
void setup() {
uint32_t ctrlb_bak = NVMCTRL->CTRLB.reg; // Turn off cache before issuing flash commands
NVMCTRL->CTRLB.reg = ctrlb_bak | NVMCTRL_CTRLB_CACHEDIS;
NVMCTRL->STATUS.reg = NVMCTRL_STATUS_MASK; // Clear error flags
if (!(NVMCTRL->INTFLAG.reg & NVMCTRL_INTFLAG_READY)) // Check if the module is busy
{
NVMCTRL->CTRLB.reg = ctrlb_bak; // Restore the setting
} else {
NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMD_SSB | // Set command
NVMCTRL_CTRLA_CMDEX_KEY;
while (!(NVMCTRL->INTFLAG.reg & NVMCTRL_INTFLAG_READY)) {} // Wait for the NVM controller to become ready
NVMCTRL->CTRLB.reg = ctrlb_bak; // Restore the setting
}
}
void loop() { }
Изменено: