Skip to content

Commit cc1bdb8

Browse files
Aymane-STfpistm
authored andcommitted
refactor(i3c): right-size temporary transfer buffers to required frame sizes
Signed-off-by: Aymane Bahssain <aymane.bahssain@st.com>
1 parent cdae807 commit cc1bdb8

3 files changed

Lines changed: 66 additions & 58 deletions

File tree

‎libraries/I3C/src/I3C.cpp‎

Lines changed: 59 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

‎libraries/I3C/src/I3C.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,9 @@ class I3CBus {
563563

564564
bool _irqEnabled = false;
565565

566+
static constexpr uint32_t I3C_CTRL_WORDS_MAX = 2U;
567+
static constexpr uint32_t I3C_CCC_TX_SCRATCH_MAX = 16U;
568+
566569
PinName _sdaPin = digitalPinToPinName(I3C_SDA);
567570
PinName _sclPin = digitalPinToPinName(I3C_SCL);
568571
};

‎libraries/I3C/src/I3C_I2C.cpp‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ int I3CBus::i2cWrite(uint8_t staticAddr,
3737
(len != 0U)) {
3838
I3C_XferTypeDef context {};
3939
I3C_PrivateTypeDef priv {};
40-
uint32_t controlBuffer[0x0F];
40+
uint32_t controlBuffer[1] = {};
4141
HAL_StatusTypeDef st;
4242

4343
priv.TargetAddr = staticAddr;
@@ -86,7 +86,7 @@ int I3CBus::i2cRead(uint8_t staticAddr,
8686
(len != 0U)) {
8787
I3C_XferTypeDef context {};
8888
I3C_PrivateTypeDef priv {};
89-
uint32_t controlBuffer[0x0F];
89+
uint32_t controlBuffer[1] = {};
9090
HAL_StatusTypeDef st;
9191

9292
priv.TargetAddr = staticAddr;
@@ -141,7 +141,7 @@ int I3CBus::i2cWriteRead(uint8_t staticAddr,
141141
} else {
142142
I3C_XferTypeDef context {};
143143
I3C_PrivateTypeDef priv {};
144-
uint32_t controlBuffer[0x0F];
144+
uint32_t controlBuffer[1] = {};
145145
HAL_StatusTypeDef st;
146146

147147
// 1) write phase with RESTART
@@ -225,7 +225,7 @@ int I3CBus::i2cWriteRegBuffer(uint8_t staticAddr,
225225
(len <= 31U)) {
226226
I3C_XferTypeDef context {};
227227
I3C_PrivateTypeDef priv {};
228-
uint32_t controlBuffer[0x0F];
228+
uint32_t controlBuffer[1] = {};
229229
uint8_t data[32] = {0};
230230
HAL_StatusTypeDef st;
231231

0 commit comments

Comments
 (0)