11/*
2- * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
2+ * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
33 *
44 * SPDX-License-Identifier: Apache-2.0
55 */
@@ -316,15 +316,16 @@ void ulp_riscv_i2c_master_set_slave_reg_addr(uint8_t slave_reg_addr)
316316 * | Slave | | | ACK | | ACK | | | ACK | DATA | | DATA | | |
317317 * |--------|--------|---------|--------|--------|--------|--------|---------|--------|--------|--------|--------|--------|--------|
318318 */
319- void ulp_riscv_i2c_master_read_from_device (uint8_t * data_rd , size_t size )
319+ esp_err_t ulp_riscv_i2c_master_read_from_device (uint8_t * data_rd , size_t size )
320320{
321321 uint32_t i = 0 ;
322322 uint32_t cmd_idx = 0 ;
323323 esp_err_t ret = ESP_OK ;
324+ uint32_t status = 0 ;
324325
325326 if (size == 0 ) {
326327 // Quietly return
327- return ;
328+ return ESP_ERR_INVALID_ARG ;
328329 }
329330
330331 /* By default, RTC I2C controller is hard wired to use CMD2 register onwards for read operations */
@@ -379,20 +380,26 @@ void ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size)
379380 /* Clear the Rx data interrupt bit */
380381 SET_PERI_REG_MASK (RTC_I2C_INT_CLR_REG , RTC_I2C_RX_DATA_INT_CLR );
381382 } else {
382- ESP_EARLY_LOGE (RTCI2C_TAG , "ulp_riscv_i2c: Read Failed!" );
383- uint32_t status = READ_PERI_REG (RTC_I2C_INT_RAW_REG );
384- ESP_EARLY_LOGE (RTCI2C_TAG , "ulp_riscv_i2c: RTC I2C Interrupt Raw Reg 0x%" PRIx32 "" , status );
385- ESP_EARLY_LOGE (RTCI2C_TAG , "ulp_riscv_i2c: RTC I2C Status Reg 0x%" PRIx32 "" , READ_PERI_REG (RTC_I2C_STATUS_REG ));
383+ status = READ_PERI_REG (RTC_I2C_INT_RAW_REG );
386384 SET_PERI_REG_MASK (RTC_I2C_INT_CLR_REG , status );
385+ ret = ESP_ERR_INVALID_RESPONSE ;
387386 break ;
388387 }
389388 }
390389
391390 portEXIT_CRITICAL (& rtc_i2c_lock );
392391
392+ if (ret != ESP_OK ) {
393+ ESP_LOGE (RTCI2C_TAG , "ulp_riscv_i2c: Read Failed!" );
394+ ESP_LOGE (RTCI2C_TAG , "ulp_riscv_i2c: RTC I2C Interrupt Raw Reg 0x%" PRIx32 "" , status );
395+ ESP_LOGE (RTCI2C_TAG , "ulp_riscv_i2c: RTC I2C Status Reg 0x%" PRIx32 "" , READ_PERI_REG (RTC_I2C_STATUS_REG ));
396+ }
397+
393398 /* Clear the RTC I2C transmission bits */
394399 CLEAR_PERI_REG_MASK (SENS_SAR_I2C_CTRL_REG , SENS_SAR_I2C_START_FORCE );
395400 CLEAR_PERI_REG_MASK (SENS_SAR_I2C_CTRL_REG , SENS_SAR_I2C_START );
401+
402+ return ret ;
396403}
397404
398405/*
@@ -412,15 +419,16 @@ void ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size)
412419 * | Slave | | | ACK | | ACK | | ACK | | ACK | |
413420 * |--------|--------|---------|--------|--------|--------|--------|--------|--------|--------|--------|
414421 */
415- void ulp_riscv_i2c_master_write_to_device (uint8_t * data_wr , size_t size )
422+ esp_err_t ulp_riscv_i2c_master_write_to_device (const uint8_t * data_wr , size_t size )
416423{
417424 uint32_t i = 0 ;
418425 uint32_t cmd_idx = 0 ;
419426 esp_err_t ret = ESP_OK ;
427+ uint32_t status = 0 ;
420428
421429 if (size == 0 ) {
422430 // Quietly return
423- return ;
431+ return ESP_ERR_INVALID_ARG ;
424432 }
425433
426434 /* By default, RTC I2C controller is hard wired to use CMD0 and CMD1 registers for write operations */
@@ -455,20 +463,27 @@ void ulp_riscv_i2c_master_write_to_device(uint8_t *data_wr, size_t size)
455463 /* Clear the Tx data interrupt bit */
456464 SET_PERI_REG_MASK (RTC_I2C_INT_CLR_REG , RTC_I2C_TX_DATA_INT_CLR );
457465 } else {
458- ESP_EARLY_LOGE (RTCI2C_TAG , "ulp_riscv_i2c: Write Failed!" );
459- uint32_t status = READ_PERI_REG (RTC_I2C_INT_RAW_REG );
460- ESP_EARLY_LOGE (RTCI2C_TAG , "ulp_riscv_i2c: RTC I2C Interrupt Raw Reg 0x%" PRIx32 "" , status );
461- ESP_EARLY_LOGE (RTCI2C_TAG , "ulp_riscv_i2c: RTC I2C Status Reg 0x%" PRIx32 "" , READ_PERI_REG (RTC_I2C_STATUS_REG ));
466+ status = READ_PERI_REG (RTC_I2C_INT_RAW_REG );
462467 SET_PERI_REG_MASK (RTC_I2C_INT_CLR_REG , status );
468+ ret = ESP_ERR_INVALID_RESPONSE ;
463469 break ;
464470 }
465471 }
466472
467473 portEXIT_CRITICAL (& rtc_i2c_lock );
468474
475+ /* In case of error, print the status after critical section */
476+ if (ret != ESP_OK ) {
477+ ESP_LOGE (RTCI2C_TAG , "ulp_riscv_i2c: Write Failed!" );
478+ ESP_LOGE (RTCI2C_TAG , "ulp_riscv_i2c: RTC I2C Interrupt Raw Reg 0x%" PRIx32 "" , status );
479+ ESP_LOGE (RTCI2C_TAG , "ulp_riscv_i2c: RTC I2C Status Reg 0x%" PRIx32 "" , READ_PERI_REG (RTC_I2C_STATUS_REG ));
480+ }
481+
469482 /* Clear the RTC I2C transmission bits */
470483 CLEAR_PERI_REG_MASK (SENS_SAR_I2C_CTRL_REG , SENS_SAR_I2C_START_FORCE );
471484 CLEAR_PERI_REG_MASK (SENS_SAR_I2C_CTRL_REG , SENS_SAR_I2C_START );
485+
486+ return ret ;
472487}
473488
474489esp_err_t ulp_riscv_i2c_master_init (const ulp_riscv_i2c_cfg_t * cfg )
0 commit comments