#include "atecc608a.h" #include "sdkconfig.h" #include #include #include #include #include #include static const char *TAG = "atecc608b"; /* ------------------------------------------------------------------------- * Module-private state * ---------------------------------------------------------------------- */ static ATCAIfaceCfg s_atecc_cfg; static uint8_t s_config_data[128]; static bool s_config_valid = false; /* ------------------------------------------------------------------------- * Internal helpers * ---------------------------------------------------------------------- */ static bool read_config_zone(void) { ATCA_STATUS status = atcab_read_config_zone(s_config_data); if (status != ATCA_SUCCESS) { ESP_LOGI(TAG, "Failed to read config zone (0x%02X) – check wiring", status); return false; } s_config_valid = true; return true; } /* ------------------------------------------------------------------------- * Public API * ---------------------------------------------------------------------- */ bool atecc608B_init(void) { ESP_LOGI(TAG, "Initialising ATECC608B..."); s_atecc_cfg.iface_type = ATCA_I2C_IFACE; s_atecc_cfg.devtype = ATECC608B; s_atecc_cfg.atcai2c.address = CONFIG_ATCA_I2C_ADDRESS; s_atecc_cfg.atcai2c.bus = 0; s_atecc_cfg.atcai2c.baud = CONFIG_ATCA_I2C_BAUD_RATE; s_atecc_cfg.wake_delay = 1500; s_atecc_cfg.rx_retries = 20; ESP_LOGI(TAG, "SDA=GPIO%d SCL=GPIO%d addr=0x%02X (7-bit 0x%02X)", CONFIG_ATCA_I2C_SDA_PIN, CONFIG_ATCA_I2C_SCL_PIN, CONFIG_ATCA_I2C_ADDRESS, CONFIG_ATCA_I2C_ADDRESS >> 1); ATCA_STATUS status = atcab_init(&s_atecc_cfg); if (status != ATCA_SUCCESS) { ESP_LOGE(TAG, "atcab_init failed: 0x%02X", status); return false; } vTaskDelay(pdMS_TO_TICKS(100)); status = atcab_wakeup(); if (status != ATCA_SUCCESS) { ESP_LOGW(TAG, "Wake returned 0x%02X (may be normal)", status); } atcab_idle(); vTaskDelay(pdMS_TO_TICKS(50)); ESP_LOGI(TAG, "ATECC608B initialised"); return true; } void atecc608B_print_config(void) { ESP_LOGI(TAG, "=== ATECC608B Configuration Zone ==="); uint8_t serial[9]; ATCA_STATUS status = atcab_read_serial_number(serial); if (status != ATCA_SUCCESS) { ESP_LOGE(TAG, "Failed to read serial number (0x%02X) – check wiring", status); return; } if (!read_config_zone()) { return; } uint8_t *c = s_config_data; for (int i = 0; i < 128; i++) { if (i % 16 == 0) printf("\n0x%02X: ", i); printf("%02X ", c[i]); } printf("\n\n"); ESP_LOGI(TAG, "=== End of ATECC608B Configuration ==="); } void atecc608B_release(void) { atcab_release(); }