risc-v/espressif: Fix I2C SCL/SDA pin attribute masks. - #20164
Conversation
|
Nice catch! Please fix issues CI is complaining about. |
esp_i2c.c composes the pin attribute masks handed to esp_configgpio()
using the logical OR operator instead of the bitwise OR operator:
#define SCL_PIN_ATTR (FUNCTION_2 || INPUT_PULLUP || OUTPUT_OPEN_DRAIN)
#define SDA_PIN_ATTR (FUNCTION_2 || INPUT_PULLUP || OUTPUT_OPEN_DRAIN)
Every operand is a non-zero bit field, so the expression collapses to 1
rather than to the intended combination. With the encodings defined in
esp_gpio.h the mask must be 171 (0xab):
FUNCTION_2 (2 << FUNCTION_SHIFT) = 128
INPUT_PULLUP (INPUT | PULLUP) = 9
OUTPUT_OPEN_DRAIN (OUTPUT | OPEN_DRAIN) = 34
Passing 1 to esp_configgpio() selects input mode only: output and
open-drain remain disabled, the pull-up is not enabled and the function
field does not match, so the pin falls back to plain GPIO function. The
I2C peripheral signal then never reaches the pads; the bus is left
floating while the transfer state machine still reports completion.
Every other pin attribute mask in this directory (esp_i2c_slave.c,
esp_i2c_bitbang.c, esp_spi.c, esp_twai.c) already uses the bitwise
operator for the same encodings, so esp_i2c.c was the only outlier.
Since this file is modified by this commit, the pre-existing nxstyle
violations reported by the check job are fixed as well, as asked in
CONTRIBUTING.md section 2.1 (adapt all modified files even if you did
not introduce the problem yourself):
* esp_i2c.c:1267 - statement over-indented inside its enclosing
block (8 spaces where the block body is at 6)
* esp_i2c.c:1303 - missing blank line after declarations
* esp_i2c.c:1592 - missing blank line after declarations
* esp_i2c.c:1710-1725 - 'case'/'default' labels inside switch(port)
sat at the same indent as the brace opening
the switch body; they belong one level further
in, with the case logic one more level in from
the label
Assisted-by: WorkBuddy:DeepSeek-V4.1-Flash
Signed-off-by: Aurora-QIU0 <2170685247@qq.com>
0443d48 to
e1c5174
Compare
|
The issues reported by the Because this PR touches
Verified locally with The workflow runs for the new commit show |
Testing update 鈥?build and runtime logs (ESP32-P4, real hardware)This change was built and exercised on hardware as part of the same ESP32-P4
So the case for this hunk rests on that static analysis plus consistency with BuildRuntime (same firmware as PR #20165) |
|
@Aurora-QIU0 please rebase to force the CI to get the fix apache/nuttx-apps#3790 |
Summary
esp_i2c.c composes the pin attribute masks passed to esp_configgpio() with the
logical OR operator instead of the bitwise OR operator:
Every operand is a non-zero bit field, so the expression collapses to 1 instead
of the intended mask. With the encodings in esp_gpio.h the mask must be 171 (0xab):
Passing 1 selects input mode only: output and open-drain stay disabled, the
pull-up is not enabled and the function field does not match, so the pin falls
back to plain GPIO function. The I2C signal never reaches the pads while the
transfer state machine still reports completion.
Every other pin attribute mask in this directory (esp_i2c_slave.c,
esp_i2c_bitbang.c, esp_spi.c, esp_twai.c) already uses the bitwise operator for
the same encodings, so esp_i2c.c is the only outlier.
Impact
Testing
This fix was validated on real hardware during an ESP32-P4 board bring-up.
The logical-OR mask left the I2C pins floating (bus never ACKed); after
switching to bitwise OR the bus enumerated correctly. (Hardware logs available
on request; the board was an ESP32-P4 Function EV Board running NuttX.)