Skip to content

Commit fd79729

Browse files
authored
Merge pull request #142 from tomoveu/add-cubemx-i2c
Add STM32 CubeMX I2C support
2 parents 17ea705 + 0c8948c commit fd79729

1 file changed

Lines changed: 75 additions & 3 deletions

File tree

examples/tpm_io.c

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,10 @@
8989
#endif
9090
#endif
9191

92-
9392
#elif defined(WOLFSSL_STM32_CUBEMX)
93+
#ifdef WOLFTPM_I2C
94+
#define TPM2_I2C_ADDR 0x2e
95+
#endif
9496

9597
#elif defined(WOLFSSL_ATMEL)
9698
#include "asf.h"
@@ -324,7 +326,73 @@
324326
#endif /* WOLFTPM_I2C */
325327

326328
#elif defined(WOLFSSL_STM32_CUBEMX)
327-
/* STM32 CubeMX Hal */
329+
#ifdef WOLFTPM_I2C
330+
/* STM32 CubeMX HAL I2C */
331+
#define STM32_CUBEMX_I2C_TIMEOUT 250
332+
static int i2c_read(void* userCtx, word32 reg, byte* data, int len)
333+
{
334+
int rc;
335+
int i2cAddr = (TPM2_I2C_ADDR << 1) | 0x01; /* For I2C read LSB is 1 */
336+
byte buf[MAX_SPI_FRAMESIZE+1];
337+
I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)userCtx;
338+
339+
/* TIS layer should never provide a buffer larger than this,
340+
but double check for good coding practice */
341+
if (len > MAX_SPI_FRAMESIZE)
342+
return BAD_FUNC_ARG;
343+
344+
buf[0] = (reg & 0xFF);
345+
rc = HAL_I2C_Master_Receive(&hi2c, i2cAddr, data, len, STM32_CUBEMX_I2C_TIMEOUT);
346+
347+
if (rc != -1) {
348+
XMEMCPY(data, buf+1, len);
349+
return TPM_RC_SUCCESS;
350+
}
351+
352+
return TPM_RC_FAILURE;
353+
}
354+
355+
static int i2c_write(void* userCtx, word32 reg, byte* data, int len)
356+
{
357+
int rc;
358+
int i2cAddr = (TPM2_I2C_ADDR << 1); /* I2C write operation, LSB is 0 */
359+
byte buf[MAX_SPI_FRAMESIZE+1];
360+
I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)userCtx;
361+
362+
/* TIS layer should never provide a buffer larger than this,
363+
but double check for good coding practice */
364+
if (len > MAX_SPI_FRAMESIZE)
365+
return BAD_FUNC_ARG;
366+
367+
buf[0] = (reg & 0xFF); /* TPM register address */
368+
XMEMCPY(buf + 1, data, len);
369+
rc = HAL_I2C_Master_Transmit(&hi2c, TPM2_I2C_ADDR << 1, buf, len);
370+
371+
if (rc != -1) {
372+
return TPM_RC_SUCCESS;
373+
}
374+
375+
return TPM_RC_FAILURE;
376+
}
377+
378+
static int TPM2_IoCb_STCubeMX_I2C(TPM2_CTX* ctx, int isRead, word32 addr,
379+
byte* buf, word16 size, void* userCtx)
380+
{
381+
int ret = TPM_RC_FAILURE;
382+
383+
if (userCtx != NULL) {
384+
if (isRead)
385+
ret = i2c_read(userCtx, addr, buf, size);
386+
else
387+
ret = i2c_write(userCtx, addr, buf, size);
388+
}
389+
390+
(void)ctx;
391+
392+
return ret;
393+
}
394+
395+
#else /* STM32 CubeMX Hal SPI */
328396
#define STM32_CUBEMX_SPI_TIMEOUT 250
329397
static int TPM2_IoCb_STCubeMX_SPI(TPM2_CTX* ctx, const byte* txBuf, byte* rxBuf,
330398
word16 xferSz, void* userCtx)
@@ -397,6 +465,7 @@
397465

398466
return ret;
399467
}
468+
#endif /* WOLFTPM_I2C */
400469

401470
#elif defined(WOLFSSL_ATMEL)
402471
/* Atmel ASF */
@@ -772,7 +841,7 @@ int TPM2_IoCb(TPM2_CTX* ctx, int isRead, word32 addr, byte* buf, word16 size,
772841
void* userCtx)
773842
{
774843
int ret = TPM_RC_FAILURE;
775-
#ifndef WOLFTPM_I2C
844+
#if !defined(WOLFTPM_I2C)
776845
byte txBuf[MAX_SPI_FRAMESIZE+TPM_TIS_HEADER_SZ];
777846
byte rxBuf[MAX_SPI_FRAMESIZE+TPM_TIS_HEADER_SZ];
778847
#endif
@@ -790,6 +859,9 @@ int TPM2_IoCb(TPM2_CTX* ctx, int isRead, word32 addr, byte* buf, word16 size,
790859
#if defined(__linux__)
791860
/* Use Linux I2C */
792861
ret = TPM2_IoCb_Linux_I2C(ctx, isRead, addr, buf, size, userCtx);
862+
#elif defined(WOLFSSL_STM32_CUBEMX)
863+
/* Use STM32 CubeMX HAL for I2C */
864+
ret = TPM2_IoCb_STCubeMX_I2C(ctx, isRead, addr, buf, size, userCtx);
793865
#else
794866
/* TODO: Add your platform here for HW I2C interface */
795867
printf("Add your platform here for HW I2C interface\n");

0 commit comments

Comments
 (0)