Skip to content

Commit 44af635

Browse files
committed
refactor(i3c): right-size temporary transfer buffers to required frame sizes
Signed-off-by: Aymane Bahssain <aymane.bahssain@st.com>
1 parent e8e1ffe commit 44af635

3 files changed

Lines changed: 57 additions & 49 deletions

File tree

‎libraries/I3C/src/I3C.cpp‎

Lines changed: 50 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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

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