mirror of https://github.com/wolfSSL/wolfTPM.git
Add tpm_io callback for STM32 CubeMX I2C HAL
Signed-off-by: Dimitar Tomov <dimi@wolfssl.com>pull/142/head
parent
77470ed4d7
commit
cb9f97f063
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue