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
|
||||
|
||||
#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)
|
||||
#include "asf.h"
|
||||
|
@ -323,8 +325,74 @@
|
|||
}
|
||||
#endif /* WOLFTPM_I2C */
|
||||
|
||||
#elif defined(WOLFSSL_STM32_CUBEMX)
|
||||
/* STM32 CubeMX Hal */
|
||||
#elif defined(WOLFSSL_STM32_CUBEMX_I2C)
|
||||
/* 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
|
||||
static int TPM2_IoCb_STCubeMX_SPI(TPM2_CTX* ctx, const byte* txBuf, byte* rxBuf,
|
||||
word16 xferSz, void* userCtx)
|
||||
|
@ -396,7 +464,7 @@
|
|||
(void)ctx;
|
||||
|
||||
return ret;
|
||||
}
|
||||
} /* WOLFSSL_STM32_CUBEMX_SPI */
|
||||
|
||||
#elif defined(WOLFSSL_ATMEL)
|
||||
/* Atmel ASF */
|
||||
|
@ -772,7 +840,7 @@ int TPM2_IoCb(TPM2_CTX* ctx, int isRead, word32 addr, byte* buf, word16 size,
|
|||
void* userCtx)
|
||||
{
|
||||
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 rxBuf[MAX_SPI_FRAMESIZE+TPM_TIS_HEADER_SZ];
|
||||
#endif
|
||||
|
@ -799,6 +867,9 @@ int TPM2_IoCb(TPM2_CTX* ctx, int isRead, word32 addr, byte* buf, word16 size,
|
|||
(void)size;
|
||||
(void)userCtx;
|
||||
#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
|
||||
/* Build SPI format buffer */
|
||||
if (isRead) {
|
||||
|
|
Loading…
Reference in New Issue