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"
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 )
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