Init
This commit is contained in:
103
main/atecc608a.c
Normal file
103
main/atecc608a.c
Normal file
@@ -0,0 +1,103 @@
|
||||
#include "atecc608a.h"
|
||||
|
||||
#include "sdkconfig.h"
|
||||
#include <esp_log.h>
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/task.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
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();
|
||||
}
|
||||
Reference in New Issue
Block a user