1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-13 02:58:57 +00:00

refactor(core/embed): use new i2c driver in optiga driver

[no changelog]
This commit is contained in:
cepetr 2024-08-28 16:50:11 +02:00
parent 86ea39f0a5
commit 371dfeb1c6
2 changed files with 50 additions and 12 deletions

View File

@ -26,7 +26,7 @@
#include <string.h>
#include "aes/aesccm.h"
#include "common.h"
#include "i2c.h"
#include "i2c_bus.h"
#include "memzero.h"
#include "optiga_hal.h"
#include "tls_prf.h"
@ -58,9 +58,6 @@ static const uint8_t I2C_STATE_BYTE1_RESP_RDY = 0x40;
// I2C base address of Optiga.
static const uint8_t BASE_ADDR = 0x30;
// Address of Optiga use by our HAL which requires it to be shifted by one bit.
static const uint16_t OPTIGA_ADDRESS = (BASE_ADDR << 1);
// Constants for our I2C HAL.
static const uint32_t I2C_TIMEOUT_MS = 25;
static const int I2C_MAX_RETRY_COUNT = 10;
@ -110,6 +107,8 @@ enum {
SCTR_PROTECTED = 0x23, // Record exchange message. Fully protected.
};
static i2c_bus_t *i2c_bus = NULL;
static uint8_t frame_num_out = 0xff;
static uint8_t frame_num_in = 0xff;
static uint8_t frame_buffer[1 + OPTIGA_DATA_REG_LEN];
@ -190,35 +189,73 @@ static uint16_t calc_crc(uint8_t *data, size_t data_size) {
optiga_result optiga_init(void) {
optiga_hal_init();
i2c_bus = i2c_bus_open(OPTIGA_I2C_INSTANCE);
if (i2c_bus == NULL) {
return OPTIGA_ERR_I2C_OPEN;
}
return optiga_set_data_reg_len(OPTIGA_DATA_REG_LEN);
}
static optiga_result optiga_i2c_write(const uint8_t *data, uint16_t data_size) {
OPTIGA_LOG(">>>", data, data_size)
i2c_op_t ops[] = {
{
.flags = I2C_FLAG_TX,
.size = data_size,
.ptr = (void *)data,
},
};
i2c_packet_t pkt = {
.address = BASE_ADDR,
.timeout = I2C_TIMEOUT_MS,
.op_count = ARRAY_LENGTH(ops),
.ops = ops,
};
for (int try_count = 0; try_count <= I2C_MAX_RETRY_COUNT; ++try_count) {
if (try_count != 0) {
hal_delay(1);
systick_delay_ms(1);
}
if (HAL_OK == i2c_transmit(OPTIGA_I2C_INSTANCE, OPTIGA_ADDRESS,
(uint8_t *)data, data_size, I2C_TIMEOUT_MS)) {
hal_delay_us(1000);
if (I2C_STATUS_OK == i2c_bus_submit_and_wait(i2c_bus, &pkt)) {
systick_delay_ms(1);
return OPTIGA_SUCCESS;
}
hal_delay_us(1000);
systick_delay_ms(1);
}
return OPTIGA_ERR_I2C_WRITE;
}
static optiga_result optiga_i2c_read(uint8_t *buffer, uint16_t buffer_size) {
i2c_op_t ops[] = {
{
.flags = I2C_FLAG_RX,
.size = buffer_size,
.ptr = buffer,
},
};
i2c_packet_t pkt = {
.address = BASE_ADDR,
.timeout = I2C_TIMEOUT_MS,
.op_count = ARRAY_LENGTH(ops),
.ops = ops,
};
for (int try_count = 0; try_count <= I2C_MAX_RETRY_COUNT; ++try_count) {
HAL_Delay(1);
if (HAL_OK == i2c_receive(OPTIGA_I2C_INSTANCE, OPTIGA_ADDRESS, buffer,
buffer_size, I2C_TIMEOUT_MS)) {
systick_delay_ms(1);
if (I2C_STATUS_OK == i2c_bus_submit_and_wait(i2c_bus, &pkt)) {
OPTIGA_LOG("<<<", buffer, buffer_size)
return OPTIGA_SUCCESS;
}
}
return OPTIGA_ERR_I2C_READ;
}

View File

@ -24,6 +24,7 @@
typedef enum _optiga_result {
OPTIGA_SUCCESS = 0, // Operation completed successfully.
OPTIGA_ERR_I2C_OPEN, // HAL failed to open I2C driver.
OPTIGA_ERR_I2C_WRITE, // HAL failed on I2C write.
OPTIGA_ERR_I2C_READ, // HAL failed on I2C read.
OPTIGA_ERR_BUSY, // Optiga is busy processing another command.