From cb9f97f0639625dfcc3e7df0cde5bb0ebd0fbcc9 Mon Sep 17 00:00:00 2001 From: Dimitar Tomov Date: Wed, 10 Feb 2021 19:45:48 +0200 Subject: [PATCH 1/6] Add tpm_io callback for STM32 CubeMX I2C HAL Signed-off-by: Dimitar Tomov --- examples/tpm_io.c | 81 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 5 deletions(-) diff --git a/examples/tpm_io.c b/examples/tpm_io.c index afe2858..fec2bc8 100644 --- a/examples/tpm_io.c +++ b/examples/tpm_io.c @@ -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) { From 577d99fd26d76d551d5e133fe7811831d95eca3c Mon Sep 17 00:00:00 2001 From: Dimitar Tomov Date: Wed, 10 Feb 2021 19:46:12 +0200 Subject: [PATCH 2/6] Update OpenSTM example to maintain compatibility for STM32 CubeMX SPI HAL Signed-off-by: Dimitar Tomov --- IDE/OPENSTM32/Inc/user_settings.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/IDE/OPENSTM32/Inc/user_settings.h b/IDE/OPENSTM32/Inc/user_settings.h index 17465a7..7f5df5f 100644 --- a/IDE/OPENSTM32/Inc/user_settings.h +++ b/IDE/OPENSTM32/Inc/user_settings.h @@ -22,8 +22,8 @@ extern "C" { #undef WOLFSSL_STM32F4 #define WOLFSSL_STM32F4 -#undef WOLFSSL_STM32_CUBEMX -#define WOLFSSL_STM32_CUBEMX +#undef WOLFSSL_STM32_CUBEMX_SPI +#define WOLFSSL_STM32_CUBEMX_SPI /* Optionally Disable Hardware Hashing Support */ //#define NO_STM32_HASH From 63c91cfa375de29cf9d7a4fc94a85554261f223f Mon Sep 17 00:00:00 2001 From: Dimitar Tomov Date: Wed, 10 Feb 2021 21:16:49 +0200 Subject: [PATCH 3/6] Correct naming convention for ifdefs related to STM32 CubeMX HAL Signed-off-by: Dimitar Tomov --- IDE/OPENSTM32/Inc/user_settings.h | 4 ++-- examples/tpm_io.c | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/IDE/OPENSTM32/Inc/user_settings.h b/IDE/OPENSTM32/Inc/user_settings.h index 7f5df5f..381598a 100644 --- a/IDE/OPENSTM32/Inc/user_settings.h +++ b/IDE/OPENSTM32/Inc/user_settings.h @@ -22,8 +22,8 @@ extern "C" { #undef WOLFSSL_STM32F4 #define WOLFSSL_STM32F4 -#undef WOLFSSL_STM32_CUBEMX_SPI -#define WOLFSSL_STM32_CUBEMX_SPI +#undef WOLFTPM_STM32_CUBEMX_SPI +#define WOLFTPM_STM32_CUBEMX_SPI /* Optionally Disable Hardware Hashing Support */ //#define NO_STM32_HASH diff --git a/examples/tpm_io.c b/examples/tpm_io.c index fec2bc8..0508b38 100644 --- a/examples/tpm_io.c +++ b/examples/tpm_io.c @@ -89,10 +89,10 @@ #endif #endif -#elif defined(WOLFSSL_STM32_CUBEMX_I2C) +#elif defined(WOLFTPM_STM32_CUBEMX_I2C) #define TPM2_I2C_ADDR 0x2e -#elif defined(WOLFSSL_STM32_CUBEMX_SPI) +#elif defined(WOLFTPM_STM32_CUBEMX_SPI) #elif defined(WOLFSSL_ATMEL) #include "asf.h" @@ -325,7 +325,7 @@ } #endif /* WOLFTPM_I2C */ -#elif defined(WOLFSSL_STM32_CUBEMX_I2C) +#elif defined(WOLFTPM_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) @@ -389,9 +389,9 @@ (void)ctx; return ret; - } /* WOLFSSL_STM32_CUBEMX_SPI */ + } /* WOLFTPM_STM32_CUBEMX_SPI */ -#elif defined(WOLFSSL_STM32_CUBEMX_SPI) +#elif defined(WOLFTPM_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, @@ -464,7 +464,7 @@ (void)ctx; return ret; - } /* WOLFSSL_STM32_CUBEMX_SPI */ + } /* WOLFTPM_STM32_CUBEMX_SPI */ #elif defined(WOLFSSL_ATMEL) /* Atmel ASF */ @@ -810,7 +810,7 @@ static int TPM2_IoCb_SPI(TPM2_CTX* ctx, const byte* txBuf, byte* rxBuf, #if defined(__linux__) ret = TPM2_IoCb_Linux_SPI(ctx, txBuf, rxBuf, xferSz, userCtx); -#elif defined(WOLFSSL_STM32_CUBEMX) +#elif defined(WOLFTPM_STM32_CUBEMX) ret = TPM2_IoCb_STCubeMX_SPI(ctx, txBuf, rxBuf, xferSz, userCtx); #elif defined(WOLFSSL_ATMEL) ret = TPM2_IoCb_Atmel_SPI(ctx, txBuf, rxBuf, xferSz, userCtx); @@ -840,7 +840,7 @@ int TPM2_IoCb(TPM2_CTX* ctx, int isRead, word32 addr, byte* buf, word16 size, void* userCtx) { int ret = TPM_RC_FAILURE; -#if !defined(WOLFTPM_I2C) && !defined(WOLFSSL_STM32_CUBEMX_I2C) +#if !defined(WOLFTPM_I2C) && !defined(WOLFTPM_STM32_CUBEMX_I2C) byte txBuf[MAX_SPI_FRAMESIZE+TPM_TIS_HEADER_SZ]; byte rxBuf[MAX_SPI_FRAMESIZE+TPM_TIS_HEADER_SZ]; #endif @@ -867,7 +867,7 @@ 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) +#elif defined(WOLFTPM_STM32_CUBEMX_I2C) /* Use STM32 CubeMX HAL for I2C */ ret = TPM2_IoCb_STCubeMX_I2C(ctx, isRead, addr, buf, size, userCtx); #else From a1a886cbc3fb432ebcca683d05e0e1997408de52 Mon Sep 17 00:00:00 2001 From: Dimitar Tomov Date: Wed, 10 Feb 2021 21:28:50 +0200 Subject: [PATCH 4/6] Revert "Correct naming convention for ifdefs related to STM32 CubeMX HAL" This reverts commit 63c91cfa375de29cf9d7a4fc94a85554261f223f. --- IDE/OPENSTM32/Inc/user_settings.h | 4 ++-- examples/tpm_io.c | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/IDE/OPENSTM32/Inc/user_settings.h b/IDE/OPENSTM32/Inc/user_settings.h index 381598a..7f5df5f 100644 --- a/IDE/OPENSTM32/Inc/user_settings.h +++ b/IDE/OPENSTM32/Inc/user_settings.h @@ -22,8 +22,8 @@ extern "C" { #undef WOLFSSL_STM32F4 #define WOLFSSL_STM32F4 -#undef WOLFTPM_STM32_CUBEMX_SPI -#define WOLFTPM_STM32_CUBEMX_SPI +#undef WOLFSSL_STM32_CUBEMX_SPI +#define WOLFSSL_STM32_CUBEMX_SPI /* Optionally Disable Hardware Hashing Support */ //#define NO_STM32_HASH diff --git a/examples/tpm_io.c b/examples/tpm_io.c index 0508b38..fec2bc8 100644 --- a/examples/tpm_io.c +++ b/examples/tpm_io.c @@ -89,10 +89,10 @@ #endif #endif -#elif defined(WOLFTPM_STM32_CUBEMX_I2C) +#elif defined(WOLFSSL_STM32_CUBEMX_I2C) #define TPM2_I2C_ADDR 0x2e -#elif defined(WOLFTPM_STM32_CUBEMX_SPI) +#elif defined(WOLFSSL_STM32_CUBEMX_SPI) #elif defined(WOLFSSL_ATMEL) #include "asf.h" @@ -325,7 +325,7 @@ } #endif /* WOLFTPM_I2C */ -#elif defined(WOLFTPM_STM32_CUBEMX_I2C) +#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) @@ -389,9 +389,9 @@ (void)ctx; return ret; - } /* WOLFTPM_STM32_CUBEMX_SPI */ + } /* WOLFSSL_STM32_CUBEMX_SPI */ -#elif defined(WOLFTPM_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, @@ -464,7 +464,7 @@ (void)ctx; return ret; - } /* WOLFTPM_STM32_CUBEMX_SPI */ + } /* WOLFSSL_STM32_CUBEMX_SPI */ #elif defined(WOLFSSL_ATMEL) /* Atmel ASF */ @@ -810,7 +810,7 @@ static int TPM2_IoCb_SPI(TPM2_CTX* ctx, const byte* txBuf, byte* rxBuf, #if defined(__linux__) ret = TPM2_IoCb_Linux_SPI(ctx, txBuf, rxBuf, xferSz, userCtx); -#elif defined(WOLFTPM_STM32_CUBEMX) +#elif defined(WOLFSSL_STM32_CUBEMX) ret = TPM2_IoCb_STCubeMX_SPI(ctx, txBuf, rxBuf, xferSz, userCtx); #elif defined(WOLFSSL_ATMEL) ret = TPM2_IoCb_Atmel_SPI(ctx, txBuf, rxBuf, xferSz, userCtx); @@ -840,7 +840,7 @@ int TPM2_IoCb(TPM2_CTX* ctx, int isRead, word32 addr, byte* buf, word16 size, void* userCtx) { int ret = TPM_RC_FAILURE; -#if !defined(WOLFTPM_I2C) && !defined(WOLFTPM_STM32_CUBEMX_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 @@ -867,7 +867,7 @@ int TPM2_IoCb(TPM2_CTX* ctx, int isRead, word32 addr, byte* buf, word16 size, (void)size; (void)userCtx; #endif -#elif defined(WOLFTPM_STM32_CUBEMX_I2C) +#elif defined(WOLFSSL_STM32_CUBEMX_I2C) /* Use STM32 CubeMX HAL for I2C */ ret = TPM2_IoCb_STCubeMX_I2C(ctx, isRead, addr, buf, size, userCtx); #else From 32f02676ccc323024ffe5b3b3de2e5adeddba67f Mon Sep 17 00:00:00 2001 From: Dimitar Tomov Date: Wed, 10 Feb 2021 21:38:23 +0200 Subject: [PATCH 5/6] Revert "Update OpenSTM example to maintain compatibility for STM32 CubeMX SPI HAL" This reverts commit 577d99fd26d76d551d5e133fe7811831d95eca3c. --- IDE/OPENSTM32/Inc/user_settings.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/IDE/OPENSTM32/Inc/user_settings.h b/IDE/OPENSTM32/Inc/user_settings.h index 7f5df5f..17465a7 100644 --- a/IDE/OPENSTM32/Inc/user_settings.h +++ b/IDE/OPENSTM32/Inc/user_settings.h @@ -22,8 +22,8 @@ extern "C" { #undef WOLFSSL_STM32F4 #define WOLFSSL_STM32F4 -#undef WOLFSSL_STM32_CUBEMX_SPI -#define WOLFSSL_STM32_CUBEMX_SPI +#undef WOLFSSL_STM32_CUBEMX +#define WOLFSSL_STM32_CUBEMX /* Optionally Disable Hardware Hashing Support */ //#define NO_STM32_HASH From 0c8948cde4ce771faab589e7fd227f6f506fef03 Mon Sep 17 00:00:00 2001 From: Dimitar Tomov Date: Wed, 10 Feb 2021 21:39:58 +0200 Subject: [PATCH 6/6] Changes from peer review, ifdef flow corrections Signed-off-by: Dimitar Tomov --- examples/tpm_io.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/examples/tpm_io.c b/examples/tpm_io.c index fec2bc8..376021c 100644 --- a/examples/tpm_io.c +++ b/examples/tpm_io.c @@ -89,10 +89,10 @@ #endif #endif -#elif defined(WOLFSSL_STM32_CUBEMX_I2C) - #define TPM2_I2C_ADDR 0x2e - -#elif defined(WOLFSSL_STM32_CUBEMX_SPI) +#elif defined(WOLFSSL_STM32_CUBEMX) + #ifdef WOLFTPM_I2C + #define TPM2_I2C_ADDR 0x2e + #endif #elif defined(WOLFSSL_ATMEL) #include "asf.h" @@ -325,7 +325,8 @@ } #endif /* WOLFTPM_I2C */ -#elif defined(WOLFSSL_STM32_CUBEMX_I2C) +#elif defined(WOLFSSL_STM32_CUBEMX) + #ifdef WOLFTPM_I2C /* STM32 CubeMX HAL I2C */ #define STM32_CUBEMX_I2C_TIMEOUT 250 static int i2c_read(void* userCtx, word32 reg, byte* data, int len) @@ -389,10 +390,9 @@ (void)ctx; return ret; - } /* WOLFSSL_STM32_CUBEMX_SPI */ + } -#elif defined(WOLFSSL_STM32_CUBEMX_SPI) - /* STM32 CubeMX Hal SPI */ + #else /* 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) @@ -464,7 +464,8 @@ (void)ctx; return ret; - } /* WOLFSSL_STM32_CUBEMX_SPI */ + } + #endif /* WOLFTPM_I2C */ #elif defined(WOLFSSL_ATMEL) /* Atmel ASF */ @@ -840,7 +841,7 @@ int TPM2_IoCb(TPM2_CTX* ctx, int isRead, word32 addr, byte* buf, word16 size, void* userCtx) { int ret = TPM_RC_FAILURE; -#if !defined(WOLFTPM_I2C) && !defined(WOLFSSL_STM32_CUBEMX_I2C) +#if !defined(WOLFTPM_I2C) byte txBuf[MAX_SPI_FRAMESIZE+TPM_TIS_HEADER_SZ]; byte rxBuf[MAX_SPI_FRAMESIZE+TPM_TIS_HEADER_SZ]; #endif @@ -858,6 +859,9 @@ int TPM2_IoCb(TPM2_CTX* ctx, int isRead, word32 addr, byte* buf, word16 size, #if defined(__linux__) /* Use Linux I2C */ ret = TPM2_IoCb_Linux_I2C(ctx, isRead, addr, buf, size, userCtx); + #elif defined(WOLFSSL_STM32_CUBEMX) + /* Use STM32 CubeMX HAL for I2C */ + ret = TPM2_IoCb_STCubeMX_I2C(ctx, isRead, addr, buf, size, userCtx); #else /* TODO: Add your platform here for HW I2C interface */ printf("Add your platform here for HW I2C interface\n"); @@ -867,9 +871,6 @@ 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) {