From c7532e27fa5f9f0e6bc94d2c415f8adb6c10cce6 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Tue, 12 Sep 2023 16:09:38 +0800 Subject: [PATCH] fix(ulp-i2c): fixed ulp i2c not working from main cpu if compiled with 0S or O2 Compiler would optimize register write to use s8i which do not work for IO registers Closes https://github.com/espressif/esp-idf/issues/12214 --- components/ulp/ulp_riscv/ulp_riscv_i2c.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/ulp/ulp_riscv/ulp_riscv_i2c.c b/components/ulp/ulp_riscv/ulp_riscv_i2c.c index 2a4b32669a..816cab3ae9 100644 --- a/components/ulp/ulp_riscv/ulp_riscv_i2c.c +++ b/components/ulp/ulp_riscv/ulp_riscv_i2c.c @@ -12,6 +12,7 @@ #include "soc/sens_reg.h" #include "soc/clk_tree_defs.h" #include "hal/i2c_ll.h" +#include "hal/misc.h" #include "driver/rtc_io.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -215,7 +216,8 @@ static void ulp_riscv_i2c_format_cmd(uint32_t cmd_idx, uint8_t op_code, uint8_t i2c_dev->command[cmd_idx].ack_en = ack_check_en; // I2C controller verifies that the ACK bit sent by the // slave device matches the ACK expected bit during WRITE. // Ignored during RSTART, STOP, END and READ cmds. - i2c_dev->command[cmd_idx].byte_num = byte_num; // Byte Num + HAL_FORCE_MODIFY_U32_REG_FIELD(i2c_dev->command[cmd_idx], byte_num, byte_num); // Byte Num + #elif CONFIG_IDF_TARGET_ESP32S3 /* Reset cmd register */ i2c_dev->i2c_cmd[cmd_idx].val = 0; @@ -230,7 +232,7 @@ static void ulp_riscv_i2c_format_cmd(uint32_t cmd_idx, uint8_t op_code, uint8_t i2c_dev->i2c_cmd[cmd_idx].i2c_ack_en = ack_check_en; // I2C controller verifies that the ACK bit sent by the // slave device matches the ACK expected bit during WRITE. // Ignored during RSTART, STOP, END and READ cmds. - i2c_dev->i2c_cmd[cmd_idx].i2c_byte_num = byte_num; // Byte Num + HAL_FORCE_MODIFY_U32_REG_FIELD(i2c_dev->i2c_cmd[cmd_idx], i2c_byte_num, byte_num); // Byte Num #endif // CONFIG_IDF_TARGET_ESP32S2 }