Add tpm_io callback for STM32 CubeMX I2C HAL

Signed-off-by: Dimitar Tomov <dimi@wolfssl.com>
pull/142/head
Dimitar Tomov 2021-02-10 19:45:48 +02:00
parent 77470ed4d7
commit cb9f97f063
1 changed files with 76 additions and 5 deletions

View File

@ -89,8 +89,10 @@
#endif #endif
#endif #endif
#elif defined(WOLFSSL_STM32_CUBEMX_I2C)
#define TPM2_I2C_ADDR 0x2e
#elif defined(WOLFSSL_STM32_CUBEMX) #elif defined(WOLFSSL_STM32_CUBEMX_SPI)
#elif defined(WOLFSSL_ATMEL) #elif defined(WOLFSSL_ATMEL)
#include "asf.h" #include "asf.h"
@ -323,8 +325,74 @@
} }
#endif /* WOLFTPM_I2C */ #endif /* WOLFTPM_I2C */
#elif defined(WOLFSSL_STM32_CUBEMX) #elif defined(WOLFSSL_STM32_CUBEMX_I2C)
/* STM32 CubeMX Hal */ /* STM32 CubeMX HAL I2C */
#define STM32_CUBEMX_I2C_TIMEOUT 250
static int i2c_read(void* userCtx, word32 reg, byte* data, int len)
{
int rc;
int i2cAddr = (TPM2_I2C_ADDR << 1) | 0x01; /* For I2C read LSB is 1 */
byte buf[MAX_SPI_FRAMESIZE+1];
I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)userCtx;
/* TIS layer should never provide a buffer larger than this,
but double check for good coding practice */
if (len > MAX_SPI_FRAMESIZE)
return BAD_FUNC_ARG;
buf[0] = (reg & 0xFF);
rc = HAL_I2C_Master_Receive(&hi2c, i2cAddr, data, len, STM32_CUBEMX_I2C_TIMEOUT);
if (rc != -1) {
XMEMCPY(data, buf+1, len);
return TPM_RC_SUCCESS;
}
return TPM_RC_FAILURE;
}
static int i2c_write(void* userCtx, word32 reg, byte* data, int len)
{
int rc;
int i2cAddr = (TPM2_I2C_ADDR << 1); /* I2C write operation, LSB is 0 */
byte buf[MAX_SPI_FRAMESIZE+1];
I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)userCtx;
/* TIS layer should never provide a buffer larger than this,
but double check for good coding practice */
if (len > MAX_SPI_FRAMESIZE)
return BAD_FUNC_ARG;
buf[0] = (reg & 0xFF); /* TPM register address */
XMEMCPY(buf + 1, data, len);
rc = HAL_I2C_Master_Transmit(&hi2c, TPM2_I2C_ADDR << 1, buf, len);
if (rc != -1) {
return TPM_RC_SUCCESS;
}
return TPM_RC_FAILURE;
}
static int TPM2_IoCb_STCubeMX_I2C(TPM2_CTX* ctx, int isRead, word32 addr,
byte* buf, word16 size, void* userCtx)
{
int ret = TPM_RC_FAILURE;
if (userCtx != NULL) {
if (isRead)
ret = i2c_read(userCtx, addr, buf, size);
else
ret = i2c_write(userCtx, addr, buf, size);
}
(void)ctx;
return ret;
} /* WOLFSSL_STM32_CUBEMX_SPI */
#elif defined(WOLFSSL_STM32_CUBEMX_SPI)
/* STM32 CubeMX Hal SPI */
#define STM32_CUBEMX_SPI_TIMEOUT 250 #define STM32_CUBEMX_SPI_TIMEOUT 250
static int TPM2_IoCb_STCubeMX_SPI(TPM2_CTX* ctx, const byte* txBuf, byte* rxBuf, static int TPM2_IoCb_STCubeMX_SPI(TPM2_CTX* ctx, const byte* txBuf, byte* rxBuf,
word16 xferSz, void* userCtx) word16 xferSz, void* userCtx)
@ -396,7 +464,7 @@
(void)ctx; (void)ctx;
return ret; return ret;
} } /* WOLFSSL_STM32_CUBEMX_SPI */
#elif defined(WOLFSSL_ATMEL) #elif defined(WOLFSSL_ATMEL)
/* Atmel ASF */ /* Atmel ASF */
@ -772,7 +840,7 @@ int TPM2_IoCb(TPM2_CTX* ctx, int isRead, word32 addr, byte* buf, word16 size,
void* userCtx) void* userCtx)
{ {
int ret = TPM_RC_FAILURE; int ret = TPM_RC_FAILURE;
#ifndef WOLFTPM_I2C #if !defined(WOLFTPM_I2C) && !defined(WOLFSSL_STM32_CUBEMX_I2C)
byte txBuf[MAX_SPI_FRAMESIZE+TPM_TIS_HEADER_SZ]; byte txBuf[MAX_SPI_FRAMESIZE+TPM_TIS_HEADER_SZ];
byte rxBuf[MAX_SPI_FRAMESIZE+TPM_TIS_HEADER_SZ]; byte rxBuf[MAX_SPI_FRAMESIZE+TPM_TIS_HEADER_SZ];
#endif #endif
@ -799,6 +867,9 @@ int TPM2_IoCb(TPM2_CTX* ctx, int isRead, word32 addr, byte* buf, word16 size,
(void)size; (void)size;
(void)userCtx; (void)userCtx;
#endif #endif
#elif defined(WOLFSSL_STM32_CUBEMX_I2C)
/* Use STM32 CubeMX HAL for I2C */
ret = TPM2_IoCb_STCubeMX_I2C(ctx, isRead, addr, buf, size, userCtx);
#else #else
/* Build SPI format buffer */ /* Build SPI format buffer */
if (isRead) { if (isRead) {