@@ -400,7 +400,7 @@ int I3CBus::write(uint8_t dynAddr,
400400 (len != 0U )) {
401401 I3C_XferTypeDef context {};
402402 I3C_PrivateTypeDef priv {};
403- uint32_t controlBuffer[0x0F ] ;
403+ uint32_t controlBuffer[1 ] = {} ;
404404 HAL_StatusTypeDef st;
405405
406406 priv.TargetAddr = dynAddr;
@@ -448,7 +448,7 @@ int I3CBus::read(uint8_t dynAddr,
448448 (len != 0U )) {
449449 I3C_XferTypeDef context {};
450450 I3C_PrivateTypeDef priv {};
451- uint32_t controlBuffer[0x0F ] ;
451+ uint32_t controlBuffer[1 ] = {} ;
452452 HAL_StatusTypeDef st;
453453
454454 priv.TargetAddr = dynAddr;
@@ -495,7 +495,7 @@ int I3CBus::writeRegBuffer(uint8_t dynAddr,
495495 } else {
496496 I3C_XferTypeDef context {};
497497 I3C_PrivateTypeDef priv {};
498- uint32_t controlBuffer[0x0F ] ;
498+ uint32_t controlBuffer[1 ] = {} ;
499499 uint8_t data[32 ] = {0 };
500500 HAL_StatusTypeDef st;
501501
@@ -547,7 +547,7 @@ int I3CBus::readRegBuffer(uint8_t dynAddr,
547547 } else {
548548 I3C_XferTypeDef context {};
549549 I3C_PrivateTypeDef priv {};
550- uint32_t controlBuffer[0x0F ] ;
550+ uint32_t controlBuffer[1 ] = {} ;
551551 uint8_t regBuf[1 ] = { reg };
552552 uint8_t data[32 ] = {0 };
553553 HAL_StatusTypeDef st;
@@ -676,38 +676,40 @@ bool I3CBus::cccBroadcastWrite(uint8_t cccId,
676676 bool result = false ;
677677
678678 if (_initialized) {
679- uint32_t controlBuffer[0xFF ];
679+ uint32_t controlBuffer[1 ] = {};
680+ uint8_t txBuffer[I3C_CCC_TX_SCRATCH_MAX ] = {};
680681 I3C_XferTypeDef context {};
681- uint8_t txBuffer[0x0F ];
682682
683683 I3C_CCCTypeDef ccc[] = {
684684 { 0x00U , cccId, { const_cast <uint8_t *>(data), length }, HAL_I3C_DIRECTION_WRITE },
685685 };
686686
687- context.CtrlBuf .pBuffer = controlBuffer;
688- context.CtrlBuf .Size = COUNTOF (controlBuffer);
689- context.TxBuf .pBuffer = txBuffer;
690- context.TxBuf .Size = 4U ;
687+ if (!(length > sizeof (txBuffer))) {
688+ context.CtrlBuf .pBuffer = controlBuffer;
689+ context.CtrlBuf .Size = 1U ;
690+ context.TxBuf .pBuffer = txBuffer;
691+ context.TxBuf .Size = length;
691692
692- uint32_t option = withDefByte ? I3C_BROADCAST_WITH_DEFBYTE_RESTART
693- : I3C_BROADCAST_WITHOUT_DEFBYTE_RESTART ;
693+ uint32_t option = withDefByte ? I3C_BROADCAST_WITH_DEFBYTE_RESTART
694+ : I3C_BROADCAST_WITHOUT_DEFBYTE_RESTART ;
694695
695- HAL_StatusTypeDef st = HAL_I3C_AddDescToFrame (
696- &_hi3c,
697- ccc,
698- nullptr ,
699- &context,
700- COUNTOF (ccc),
701- option);
696+ HAL_StatusTypeDef st = HAL_I3C_AddDescToFrame (
697+ &_hi3c,
698+ ccc,
699+ nullptr ,
700+ &context,
701+ COUNTOF (ccc),
702+ option);
702703
703- if (st == HAL_OK ) {
704- st = HAL_I3C_Ctrl_TransmitCCC (&_hi3c, &context, timeout);
705704 if (st == HAL_OK ) {
706- result = true ;
707- } else {
708- uint32_t err = HAL_I3C_GetError (&_hi3c);
709- if ((err & HAL_I3C_ERROR_CE2 ) != 0U ) {
705+ st = HAL_I3C_Ctrl_TransmitCCC (&_hi3c, &context, timeout);
706+ if (st == HAL_OK ) {
710707 result = true ;
708+ } else {
709+ uint32_t err = HAL_I3C_GetError (&_hi3c);
710+ if ((err & HAL_I3C_ERROR_CE2 ) != 0U ) {
711+ result = true ;
712+ }
711713 }
712714 }
713715 }
@@ -726,9 +728,9 @@ bool I3CBus::cccDirectWrite(uint8_t targetAddr,
726728 bool result = false ;
727729
728730 if (_initialized) {
729- uint32_t controlBuffer[0xFF ];
731+ uint32_t controlBuffer[2 ] = {};
732+ uint8_t txBuffer[I3C_CCC_TX_SCRATCH_MAX ] = {};
730733 I3C_XferTypeDef context {};
731- uint8_t txBuffer[0x0F ];
732734
733735 I3C_CCCTypeDef ccc[] = {
734736 {
@@ -739,26 +741,29 @@ bool I3CBus::cccDirectWrite(uint8_t targetAddr,
739741 },
740742 };
741743
742- context.CtrlBuf .pBuffer = controlBuffer;
743- context.CtrlBuf .Size = COUNTOF (controlBuffer);
744- context.TxBuf .pBuffer = txBuffer;
745- context.TxBuf .Size = 4U ;
744+ if (!(length > sizeof (txBuffer))) {
746745
747- uint32_t option = withDefByte ? I3C_DIRECT_WITH_DEFBYTE_RESTART
748- : I3C_DIRECT_WITHOUT_DEFBYTE_RESTART ;
746+ context.CtrlBuf .pBuffer = controlBuffer;
747+ context.CtrlBuf .Size = 2U ;
748+ context.TxBuf .pBuffer = txBuffer;
749+ context.TxBuf .Size = length;
749750
750- HAL_StatusTypeDef st = HAL_I3C_AddDescToFrame (
751- &_hi3c,
752- ccc,
753- nullptr ,
754- &context,
755- COUNTOF (ccc),
756- option);
751+ uint32_t option = withDefByte ? I3C_DIRECT_WITH_DEFBYTE_RESTART
752+ : I3C_DIRECT_WITHOUT_DEFBYTE_RESTART ;
753+
754+ HAL_StatusTypeDef st = HAL_I3C_AddDescToFrame (
755+ &_hi3c,
756+ ccc,
757+ nullptr ,
758+ &context,
759+ COUNTOF (ccc),
760+ option);
757761
758- if (st == HAL_OK ) {
759- st = HAL_I3C_Ctrl_TransmitCCC (&_hi3c, &context, timeout);
760762 if (st == HAL_OK ) {
761- result = true ;
763+ st = HAL_I3C_Ctrl_TransmitCCC (&_hi3c, &context, timeout);
764+ if (st == HAL_OK ) {
765+ result = true ;
766+ }
762767 }
763768 }
764769 }
@@ -775,7 +780,7 @@ bool I3CBus::cccDirectRead(uint8_t targetAddr,
775780 bool result = false ;
776781
777782 if (_initialized && (rxData != nullptr ) && (rxLength != 0U )) {
778- uint32_t controlBuffer[0xFF ] ;
783+ uint32_t controlBuffer[2 ] = {} ;
779784 I3C_XferTypeDef context {};
780785
781786 I3C_CCCTypeDef ccc[] = {
@@ -788,7 +793,7 @@ bool I3CBus::cccDirectRead(uint8_t targetAddr,
788793 };
789794
790795 context.CtrlBuf .pBuffer = controlBuffer;
791- context.CtrlBuf .Size = COUNTOF (controlBuffer) ;
796+ context.CtrlBuf .Size = 2U ;
792797 context.RxBuf .pBuffer = rxData;
793798 context.RxBuf .Size = rxLength;
794799
0 commit comments