CDC Badge OS
Firmware for the CDC Badge v1.0 hardware security key
Loading...
Searching...
No Matches
libtropic_port_esp32.cpp
Go to the documentation of this file.
1
5
7#include "cdc_hal/ISpiBus.h"
8#include "cdc_hal/hw_config.h"
9#include "libtropic_port.h"
10#include "driver/gpio.h"
11#include "driver/spi_master.h"
12#include "esp_err.h"
13#include "esp_random.h"
14#include "freertos/FreeRTOS.h"
15#include "freertos/task.h"
16#include "cdc_log.h"
17#include <cstdarg>
18#include <cstdio>
19
20static const char* TAG = "TR01-SPI";
21
22extern "C" lt_ret_t lt_port_init(lt_l2_state_t *s2) {
23 if (!s2 || !s2->device) {
24 return LT_PARAM_ERR;
25 }
26
27 lt_dev_esp32_t *device = static_cast<lt_dev_esp32_t *>(s2->device);
28 device->spi = nullptr;
29
30 // Configure CS pin as output (manual control)
31 gpio_config_t io_conf = {};
32 io_conf.pin_bit_mask = 1ULL << device->cs_pin;
33 io_conf.mode = GPIO_MODE_OUTPUT;
34 io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
35 io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
36 io_conf.intr_type = GPIO_INTR_DISABLE;
37 gpio_config(&io_conf);
38 gpio_set_level(device->cs_pin, 1);
39
40 // Initialize shared SPI bus
41 if (cdc::hal::initSharedSpiBus() != ESP_OK) {
42 return LT_HAL_ERROR;
43 }
44
45 // Add TROPIC01 as device on shared SPI bus
46 spi_device_interface_config_t devcfg = {};
47 devcfg.clock_speed_hz = 10 * 1000 * 1000; // 10 MHz
48 devcfg.mode = 0;
49 devcfg.spics_io_num = -1; // Manual CS
50 devcfg.queue_size = 1;
51
52 if (spi_bus_add_device(cdc::hal::getSharedSpiHost(), &devcfg, &device->spi) != ESP_OK) {
53 return LT_HAL_ERROR;
54 }
55
56 LOG_I(TAG, "TROPIC01 SPI initialized (CS=GPIO%d)", device->cs_pin);
57 return LT_OK;
58}
59
60extern "C" lt_ret_t lt_port_deinit(lt_l2_state_t *s2) {
61 if (!s2 || !s2->device) {
62 return LT_PARAM_ERR;
63 }
64
65 lt_dev_esp32_t *device = static_cast<lt_dev_esp32_t *>(s2->device);
66 if (device->spi) {
67 spi_bus_remove_device(device->spi);
68 device->spi = nullptr;
69 }
70 gpio_set_level(device->cs_pin, 1);
71 return LT_OK;
72}
73
74extern "C" lt_ret_t lt_port_spi_csn_low(lt_l2_state_t *s2) {
75 if (!s2 || !s2->device) {
76 return LT_PARAM_ERR;
77 }
78 lt_dev_esp32_t *device = static_cast<lt_dev_esp32_t *>(s2->device);
79 gpio_set_level(device->cs_pin, 0);
80 return LT_OK;
81}
82
83extern "C" lt_ret_t lt_port_spi_csn_high(lt_l2_state_t *s2) {
84 if (!s2 || !s2->device) {
85 return LT_PARAM_ERR;
86 }
87 lt_dev_esp32_t *device = static_cast<lt_dev_esp32_t *>(s2->device);
88 gpio_set_level(device->cs_pin, 1);
89 return LT_OK;
90}
91
92extern "C" lt_ret_t lt_port_spi_transfer(lt_l2_state_t *s2, uint8_t offset, uint16_t tx_len,
93 uint32_t timeout_ms) {
94 (void)timeout_ms;
95 if (!s2 || !s2->device) {
96 return LT_PARAM_ERR;
97 }
98 lt_dev_esp32_t *device = static_cast<lt_dev_esp32_t *>(s2->device);
99 if (!device->spi) {
100 LOG_E(TAG, "SPI not initialized");
101 return LT_HAL_ERROR;
102 }
103
104 // In-place SPI transfer (TX/RX share buffer)
105 spi_transaction_t t = {};
106 t.length = static_cast<size_t>(tx_len) * 8;
107 t.tx_buffer = s2->buff + offset;
108 t.rx_buffer = s2->buff + offset;
109 esp_err_t err = spi_device_polling_transmit(device->spi, &t);
110
111 if (err != ESP_OK) {
112 LOG_E(TAG, "SPI transmit failed: %d", err);
113 return LT_HAL_ERROR;
114 }
115 return LT_OK;
116}
117
118extern "C" lt_ret_t lt_port_delay(lt_l2_state_t *s2, uint32_t ms) {
119 (void)s2;
120 vTaskDelay(pdMS_TO_TICKS(ms));
121 return LT_OK;
122}
123
124#if LT_USE_INT_PIN
125extern "C" lt_ret_t lt_port_delay_on_int(lt_l2_state_t *s2, uint32_t ms) {
126 (void)s2;
127 (void)ms;
128 return LT_L1_INT_TIMEOUT;
129}
130#endif
131
132extern "C" lt_ret_t lt_port_random_bytes(lt_l2_state_t *s2, void *buff, size_t count) {
133 (void)s2;
134 if (!buff || count == 0) {
135 return LT_PARAM_ERR;
136 }
137 esp_fill_random(buff, count);
138 return LT_OK;
139}
140
141// Required by libtropic's LT_LOG_* macros (libtropic_logging.h). The format
142// strings already carry the level prefix and trailing newline; write them to
143// UART0 stdout.
144extern "C" int lt_port_log(const char *format, ...) {
145 va_list args;
146 va_start(args, format);
147 int ret = vprintf(format, args);
148 va_end(args);
149 return ret;
150}
static const char * TAG
CDC Log: logging over TinyUSB CDC and UART.
#define LOG_I(tag, fmt,...)
Definition cdc_log.h:147
#define LOG_E(tag, fmt,...)
Definition cdc_log.h:145
lt_ret_t lt_port_delay(lt_l2_state_t *s2, uint32_t ms)
int lt_port_log(const char *format,...)
lt_ret_t lt_port_random_bytes(lt_l2_state_t *s2, void *buff, size_t count)
lt_ret_t lt_port_init(lt_l2_state_t *s2)
lt_ret_t lt_port_spi_csn_high(lt_l2_state_t *s2)
lt_ret_t lt_port_spi_transfer(lt_l2_state_t *s2, uint8_t offset, uint16_t tx_len, uint32_t timeout_ms)
lt_ret_t lt_port_deinit(lt_l2_state_t *s2)
lt_ret_t lt_port_spi_csn_low(lt_l2_state_t *s2)
esp_err_t initSharedSpiBus()
Initializes shared SPI bus once for all SPI peripherals.
Definition SpiBus.cpp:33
spi_host_device_t getSharedSpiHost()
Returns shared SPI host identifier.
Definition SpiBus.cpp:25