@@ -278,7 +278,7 @@ bool I3CBus::begin(uint32_t freq,
278278
279279 if (HAL_I3C_Ctrl_Config (&_hi3c, &ctrlCfgHal) != HAL_OK ) {
280280 result = false ;
281- } else {
281+ } else {
282282 registerInstanceOwner ();
283283 _initialized = true ;
284284 _role = I3CRole::Controller;
@@ -333,7 +333,7 @@ bool I3CBus::setClock(uint32_t i3cFreq)
333333 LL_I3C_CtrlBusConfTypeDef outCtrl {};
334334
335335 if (buildControllerTiming (i3cFreq, outCtrl) &&
336- (HAL_I3C_Ctrl_BusCharacteristicConfig (&_hi3c, &outCtrl) == HAL_OK )) {
336+ (HAL_I3C_Ctrl_BusCharacteristicConfig (&_hi3c, &outCtrl) == HAL_OK )) {
337337 result = true ;
338338 }
339339 }
@@ -375,7 +375,7 @@ int I3CBus::write(uint8_t dynAddr,
375375 (len != 0U )) {
376376 I3C_XferTypeDef context {};
377377 I3C_PrivateTypeDef priv {};
378- uint32_t controlBuffer[0x0F ] ;
378+ uint32_t controlBuffer[1 ] = {} ;
379379 HAL_StatusTypeDef st;
380380
381381 priv.TargetAddr = dynAddr;
@@ -423,7 +423,7 @@ int I3CBus::read(uint8_t dynAddr,
423423 (len != 0U )) {
424424 I3C_XferTypeDef context {};
425425 I3C_PrivateTypeDef priv {};
426- uint32_t controlBuffer[0x0F ] ;
426+ uint32_t controlBuffer[1 ] = {} ;
427427 HAL_StatusTypeDef st;
428428
429429 priv.TargetAddr = dynAddr;
@@ -470,7 +470,7 @@ int I3CBus::writeRegBuffer(uint8_t dynAddr,
470470 } else {
471471 I3C_XferTypeDef context {};
472472 I3C_PrivateTypeDef priv {};
473- uint32_t controlBuffer[0x0F ] ;
473+ uint32_t controlBuffer[1 ] = {} ;
474474 uint8_t data[32 ] = {0 };
475475 HAL_StatusTypeDef st;
476476
@@ -522,7 +522,7 @@ int I3CBus::readRegBuffer(uint8_t dynAddr,
522522 } else {
523523 I3C_XferTypeDef context {};
524524 I3C_PrivateTypeDef priv {};
525- uint32_t controlBuffer[0x0F ] ;
525+ uint32_t controlBuffer[1 ] = {} ;
526526 uint8_t regBuf[1 ] = { reg };
527527 uint8_t data[32 ] = {0 };
528528 HAL_StatusTypeDef st;
@@ -651,38 +651,40 @@ bool I3CBus::cccBroadcastWrite(uint8_t cccId,
651651 bool result = false ;
652652
653653 if (_initialized) {
654- uint32_t controlBuffer[0xFF ];
654+ uint32_t controlBuffer[1 ] = {};
655+ uint8_t txBuffer[I3C_CCC_TX_SCRATCH_MAX ] = {};
655656 I3C_XferTypeDef context {};
656- uint8_t txBuffer[0x0F ];
657657
658658 I3C_CCCTypeDef ccc[] = {
659659 { 0x00U , cccId, { const_cast <uint8_t *>(data), length }, HAL_I3C_DIRECTION_WRITE },
660660 };
661661
662- context.CtrlBuf .pBuffer = controlBuffer;
663- context.CtrlBuf .Size = COUNTOF (controlBuffer);
664- context.TxBuf .pBuffer = txBuffer;
665- context.TxBuf .Size = 4U ;
662+ if (!(length > sizeof (txBuffer))) {
663+ context.CtrlBuf .pBuffer = controlBuffer;
664+ context.CtrlBuf .Size = 1U ;
665+ context.TxBuf .pBuffer = txBuffer;
666+ context.TxBuf .Size = length;
666667
667- uint32_t option = withDefByte ? I3C_BROADCAST_WITH_DEFBYTE_RESTART
668- : I3C_BROADCAST_WITHOUT_DEFBYTE_RESTART ;
668+ uint32_t option = withDefByte ? I3C_BROADCAST_WITH_DEFBYTE_RESTART
669+ : I3C_BROADCAST_WITHOUT_DEFBYTE_RESTART ;
669670
670- HAL_StatusTypeDef st = HAL_I3C_AddDescToFrame (
671- &_hi3c,
672- ccc,
673- nullptr ,
674- &context,
675- COUNTOF (ccc),
676- option );
671+ result = ( HAL_I3C_AddDescToFrame (
672+ &_hi3c,
673+ ccc,
674+ nullptr ,
675+ &context,
676+ COUNTOF (ccc),
677+ option) == HAL_OK );
677678
678- if (st == HAL_OK ) {
679- st = HAL_I3C_Ctrl_TransmitCCC (&_hi3c, &context, timeout);
680679 if (st == HAL_OK ) {
681- result = true ;
682- } else {
683- uint32_t err = HAL_I3C_GetError (&_hi3c);
684- if ((err & HAL_I3C_ERROR_CE2 ) != 0U ) {
680+ st = HAL_I3C_Ctrl_TransmitCCC (&_hi3c, &context, timeout);
681+ if (st == HAL_OK ) {
685682 result = true ;
683+ } else {
684+ uint32_t err = HAL_I3C_GetError (&_hi3c);
685+ if ((err & HAL_I3C_ERROR_CE2 ) != 0U ) {
686+ result = true ;
687+ }
686688 }
687689 }
688690 }
@@ -701,9 +703,9 @@ bool I3CBus::cccDirectWrite(uint8_t targetAddr,
701703 bool result = false ;
702704
703705 if (_initialized) {
704- uint32_t controlBuffer[0xFF ];
706+ uint32_t controlBuffer[2 ] = {};
707+ uint8_t txBuffer[I3C_CCC_TX_SCRATCH_MAX ] = {};
705708 I3C_XferTypeDef context {};
706- uint8_t txBuffer[0x0F ];
707709
708710 I3C_CCCTypeDef ccc[] = {
709711 {
@@ -714,26 +716,29 @@ bool I3CBus::cccDirectWrite(uint8_t targetAddr,
714716 },
715717 };
716718
717- context.CtrlBuf .pBuffer = controlBuffer;
718- context.CtrlBuf .Size = COUNTOF (controlBuffer);
719- context.TxBuf .pBuffer = txBuffer;
720- context.TxBuf .Size = 4U ;
719+ if (!(length > sizeof (txBuffer))) {
721720
722- uint32_t option = withDefByte ? I3C_DIRECT_WITH_DEFBYTE_RESTART
723- : I3C_DIRECT_WITHOUT_DEFBYTE_RESTART ;
721+ context.CtrlBuf .pBuffer = controlBuffer;
722+ context.CtrlBuf .Size = 2U ;
723+ context.TxBuf .pBuffer = txBuffer;
724+ context.TxBuf .Size = length;
724725
725- HAL_StatusTypeDef st = HAL_I3C_AddDescToFrame (
726- &_hi3c,
727- ccc,
728- nullptr ,
729- &context,
730- COUNTOF (ccc),
731- option);
726+ uint32_t option = withDefByte ? I3C_DIRECT_WITH_DEFBYTE_RESTART
727+ : I3C_DIRECT_WITHOUT_DEFBYTE_RESTART ;
728+
729+ result = (HAL_I3C_AddDescToFrame (
730+ &_hi3c,
731+ ccc,
732+ nullptr ,
733+ &context,
734+ COUNTOF (ccc),
735+ option) == HAL_OK );
732736
733- if (st == HAL_OK ) {
734- st = HAL_I3C_Ctrl_TransmitCCC (&_hi3c, &context, timeout);
735737 if (st == HAL_OK ) {
736- result = true ;
738+ st = HAL_I3C_Ctrl_TransmitCCC (&_hi3c, &context, timeout);
739+ if (st == HAL_OK ) {
740+ result = true ;
741+ }
737742 }
738743 }
739744 }
@@ -750,7 +755,7 @@ bool I3CBus::cccDirectRead(uint8_t targetAddr,
750755 bool result = false ;
751756
752757 if (_initialized && (rxData != nullptr ) && (rxLength != 0U )) {
753- uint32_t controlBuffer[0xFF ] ;
758+ uint32_t controlBuffer[2 ] = {} ;
754759 I3C_XferTypeDef context {};
755760
756761 I3C_CCCTypeDef ccc[] = {
@@ -763,17 +768,17 @@ bool I3CBus::cccDirectRead(uint8_t targetAddr,
763768 };
764769
765770 context.CtrlBuf .pBuffer = controlBuffer;
766- context.CtrlBuf .Size = COUNTOF (controlBuffer) ;
771+ context.CtrlBuf .Size = 2U ;
767772 context.RxBuf .pBuffer = rxData;
768773 context.RxBuf .Size = rxLength;
769774
770- HAL_StatusTypeDef st = HAL_I3C_AddDescToFrame (
771- &_hi3c,
772- ccc,
773- nullptr ,
774- &context,
775- COUNTOF (ccc),
776- I3C_DIRECT_WITHOUT_DEFBYTE_RESTART );
775+ result = ( HAL_I3C_AddDescToFrame (
776+ &_hi3c,
777+ ccc,
778+ nullptr ,
779+ &context,
780+ COUNTOF (ccc),
781+ I3C_DIRECT_WITHOUT_DEFBYTE_RESTART ) == HAL_OK );
777782
778783 if (st == HAL_OK ) {
779784 st = HAL_I3C_Ctrl_ReceiveCCC (&_hi3c, &context, timeout);
0 commit comments