mirror of
https://github.com/espressif/esp-idf.git
synced 2025-10-03 10:30:58 +02:00
refactor(ulp_riscv): Modify ulp i2c read/write functions to return error code
Updated the i2c read/write APIs ulp_riscv_i2c_master_read_from_device and ulp_riscv_i2c_master_write_to_device in ulp_riscv component to return error codes back to the application Closes https://github.com/espressif/esp-idf/issues/15904
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -114,8 +114,9 @@ void ulp_riscv_i2c_master_set_slave_reg_addr(uint8_t slave_reg_addr);
|
|||||||
*
|
*
|
||||||
* @param data_rd Buffer to hold data to be read
|
* @param data_rd Buffer to hold data to be read
|
||||||
* @param size Size of data to be read in bytes
|
* @param size Size of data to be read in bytes
|
||||||
|
* @return esp_err_t ESP_OK when successful
|
||||||
*/
|
*/
|
||||||
void ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size);
|
esp_err_t ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Write to I2C slave device
|
* @brief Write to I2C slave device
|
||||||
@@ -124,8 +125,9 @@ void ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size);
|
|||||||
*
|
*
|
||||||
* @param data_wr Buffer which holds the data to be written
|
* @param data_wr Buffer which holds the data to be written
|
||||||
* @param size Size of data to be written in bytes
|
* @param size Size of data to be written in bytes
|
||||||
|
* @return esp_err_t ESP_OK when successful
|
||||||
*/
|
*/
|
||||||
void ulp_riscv_i2c_master_write_to_device(uint8_t *data_wr, size_t size);
|
esp_err_t ulp_riscv_i2c_master_write_to_device(const uint8_t *data_wr, size_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initialize and configure the RTC I2C for use by ULP RISC-V
|
* @brief Initialize and configure the RTC I2C for use by ULP RISC-V
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -12,6 +12,7 @@ extern "C" {
|
|||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "esp_err.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set the I2C slave device address
|
* @brief Set the I2C slave device address
|
||||||
@@ -34,8 +35,9 @@ void ulp_riscv_i2c_master_set_slave_reg_addr(uint8_t slave_reg_addr);
|
|||||||
*
|
*
|
||||||
* @param data_rd Buffer to hold data to be read
|
* @param data_rd Buffer to hold data to be read
|
||||||
* @param size Size of data to be read in bytes
|
* @param size Size of data to be read in bytes
|
||||||
|
* @return esp_err_t ESP_OK when successful
|
||||||
*/
|
*/
|
||||||
void ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size);
|
esp_err_t ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Write to I2C slave device
|
* @brief Write to I2C slave device
|
||||||
@@ -44,8 +46,9 @@ void ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size);
|
|||||||
*
|
*
|
||||||
* @param data_wr Buffer which holds the data to be written
|
* @param data_wr Buffer which holds the data to be written
|
||||||
* @param size Size of data to be written in bytes
|
* @param size Size of data to be written in bytes
|
||||||
|
* @return esp_err_t ESP_OK when successful
|
||||||
*/
|
*/
|
||||||
void ulp_riscv_i2c_master_write_to_device(uint8_t *data_wr, size_t size);
|
esp_err_t ulp_riscv_i2c_master_write_to_device(const uint8_t *data_wr, size_t size);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
#include "esp_err.h"
|
||||||
#include "ulp_riscv_i2c_ulp_core.h"
|
#include "ulp_riscv_i2c_ulp_core.h"
|
||||||
#include "ulp_riscv_utils.h"
|
#include "ulp_riscv_utils.h"
|
||||||
#include "soc/rtc_i2c_reg.h"
|
#include "soc/rtc_i2c_reg.h"
|
||||||
@@ -131,14 +132,15 @@ void ulp_riscv_i2c_master_set_slave_reg_addr(uint8_t slave_reg_addr)
|
|||||||
* | Slave | | | ACK | | ACK | | | ACK | DATA | | DATA | | |
|
* | Slave | | | ACK | | ACK | | | ACK | DATA | | DATA | | |
|
||||||
* |--------|--------|---------|--------|--------|--------|--------|---------|--------|--------|--------|--------|--------|--------|
|
* |--------|--------|---------|--------|--------|--------|--------|---------|--------|--------|--------|--------|--------|--------|
|
||||||
*/
|
*/
|
||||||
void ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size)
|
esp_err_t ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size)
|
||||||
{
|
{
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
uint32_t cmd_idx = 0;
|
uint32_t cmd_idx = 0;
|
||||||
|
esp_err_t ret = ESP_OK;
|
||||||
|
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
// Quietly return
|
// Quietly return
|
||||||
return;
|
return ESP_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Workaround for IDF-9145
|
// Workaround for IDF-9145
|
||||||
@@ -197,6 +199,7 @@ void ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size)
|
|||||||
} else {
|
} else {
|
||||||
/* Error in transaction */
|
/* Error in transaction */
|
||||||
CLEAR_PERI_REG_MASK(RTC_I2C_INT_CLR_REG, READ_PERI_REG(RTC_I2C_INT_ST_REG));
|
CLEAR_PERI_REG_MASK(RTC_I2C_INT_CLR_REG, READ_PERI_REG(RTC_I2C_INT_ST_REG));
|
||||||
|
ret = ESP_ERR_INVALID_RESPONSE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -207,6 +210,8 @@ void ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size)
|
|||||||
|
|
||||||
// Workaround for IDF-9145
|
// Workaround for IDF-9145
|
||||||
ULP_RISCV_EXIT_CRITICAL();
|
ULP_RISCV_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -226,14 +231,15 @@ void ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size)
|
|||||||
* | Slave | | | ACK | | ACK | | ACK | | ACK | |
|
* | Slave | | | ACK | | ACK | | ACK | | ACK | |
|
||||||
* |--------|--------|---------|--------|--------|--------|--------|--------|--------|--------|--------|
|
* |--------|--------|---------|--------|--------|--------|--------|--------|--------|--------|--------|
|
||||||
*/
|
*/
|
||||||
void ulp_riscv_i2c_master_write_to_device(uint8_t *data_wr, size_t size)
|
esp_err_t ulp_riscv_i2c_master_write_to_device(const uint8_t *data_wr, size_t size)
|
||||||
{
|
{
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
uint32_t cmd_idx = 0;
|
uint32_t cmd_idx = 0;
|
||||||
|
esp_err_t ret = ESP_OK;
|
||||||
|
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
// Quietly return
|
// Quietly return
|
||||||
return;
|
return ESP_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Workaround for IDF-9145
|
// Workaround for IDF-9145
|
||||||
@@ -271,6 +277,7 @@ void ulp_riscv_i2c_master_write_to_device(uint8_t *data_wr, size_t size)
|
|||||||
SET_PERI_REG_MASK(RTC_I2C_INT_CLR_REG, RTC_I2C_TX_DATA_INT_CLR);
|
SET_PERI_REG_MASK(RTC_I2C_INT_CLR_REG, RTC_I2C_TX_DATA_INT_CLR);
|
||||||
} else {
|
} else {
|
||||||
SET_PERI_REG_MASK(RTC_I2C_INT_CLR_REG, READ_PERI_REG(RTC_I2C_INT_ST_REG));
|
SET_PERI_REG_MASK(RTC_I2C_INT_CLR_REG, READ_PERI_REG(RTC_I2C_INT_ST_REG));
|
||||||
|
ret = ESP_ERR_INVALID_RESPONSE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -281,4 +288,6 @@ void ulp_riscv_i2c_master_write_to_device(uint8_t *data_wr, size_t size)
|
|||||||
|
|
||||||
// Workaround for IDF-9145
|
// Workaround for IDF-9145
|
||||||
ULP_RISCV_EXIT_CRITICAL();
|
ULP_RISCV_EXIT_CRITICAL();
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
@@ -316,7 +316,7 @@ void ulp_riscv_i2c_master_set_slave_reg_addr(uint8_t slave_reg_addr)
|
|||||||
* | Slave | | | ACK | | ACK | | | ACK | DATA | | DATA | | |
|
* | Slave | | | ACK | | ACK | | | ACK | DATA | | DATA | | |
|
||||||
* |--------|--------|---------|--------|--------|--------|--------|---------|--------|--------|--------|--------|--------|--------|
|
* |--------|--------|---------|--------|--------|--------|--------|---------|--------|--------|--------|--------|--------|--------|
|
||||||
*/
|
*/
|
||||||
void ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size)
|
esp_err_t ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size)
|
||||||
{
|
{
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
uint32_t cmd_idx = 0;
|
uint32_t cmd_idx = 0;
|
||||||
@@ -325,7 +325,7 @@ void ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size)
|
|||||||
|
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
// Quietly return
|
// Quietly return
|
||||||
return;
|
return ESP_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* By default, RTC I2C controller is hard wired to use CMD2 register onwards for read operations */
|
/* By default, RTC I2C controller is hard wired to use CMD2 register onwards for read operations */
|
||||||
@@ -382,6 +382,7 @@ void ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size)
|
|||||||
} else {
|
} else {
|
||||||
status = READ_PERI_REG(RTC_I2C_INT_RAW_REG);
|
status = READ_PERI_REG(RTC_I2C_INT_RAW_REG);
|
||||||
SET_PERI_REG_MASK(RTC_I2C_INT_CLR_REG, status);
|
SET_PERI_REG_MASK(RTC_I2C_INT_CLR_REG, status);
|
||||||
|
ret = ESP_ERR_INVALID_RESPONSE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -397,6 +398,8 @@ void ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size)
|
|||||||
/* Clear the RTC I2C transmission bits */
|
/* Clear the RTC I2C transmission bits */
|
||||||
CLEAR_PERI_REG_MASK(SENS_SAR_I2C_CTRL_REG, SENS_SAR_I2C_START_FORCE);
|
CLEAR_PERI_REG_MASK(SENS_SAR_I2C_CTRL_REG, SENS_SAR_I2C_START_FORCE);
|
||||||
CLEAR_PERI_REG_MASK(SENS_SAR_I2C_CTRL_REG, SENS_SAR_I2C_START);
|
CLEAR_PERI_REG_MASK(SENS_SAR_I2C_CTRL_REG, SENS_SAR_I2C_START);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -416,7 +419,7 @@ void ulp_riscv_i2c_master_read_from_device(uint8_t *data_rd, size_t size)
|
|||||||
* | Slave | | | ACK | | ACK | | ACK | | ACK | |
|
* | Slave | | | ACK | | ACK | | ACK | | ACK | |
|
||||||
* |--------|--------|---------|--------|--------|--------|--------|--------|--------|--------|--------|
|
* |--------|--------|---------|--------|--------|--------|--------|--------|--------|--------|--------|
|
||||||
*/
|
*/
|
||||||
void ulp_riscv_i2c_master_write_to_device(uint8_t *data_wr, size_t size)
|
esp_err_t ulp_riscv_i2c_master_write_to_device(const uint8_t *data_wr, size_t size)
|
||||||
{
|
{
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
uint32_t cmd_idx = 0;
|
uint32_t cmd_idx = 0;
|
||||||
@@ -425,7 +428,7 @@ void ulp_riscv_i2c_master_write_to_device(uint8_t *data_wr, size_t size)
|
|||||||
|
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
// Quietly return
|
// Quietly return
|
||||||
return;
|
return ESP_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* By default, RTC I2C controller is hard wired to use CMD0 and CMD1 registers for write operations */
|
/* By default, RTC I2C controller is hard wired to use CMD0 and CMD1 registers for write operations */
|
||||||
@@ -462,6 +465,7 @@ void ulp_riscv_i2c_master_write_to_device(uint8_t *data_wr, size_t size)
|
|||||||
} else {
|
} else {
|
||||||
status = READ_PERI_REG(RTC_I2C_INT_RAW_REG);
|
status = READ_PERI_REG(RTC_I2C_INT_RAW_REG);
|
||||||
SET_PERI_REG_MASK(RTC_I2C_INT_CLR_REG, status);
|
SET_PERI_REG_MASK(RTC_I2C_INT_CLR_REG, status);
|
||||||
|
ret = ESP_ERR_INVALID_RESPONSE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -478,6 +482,8 @@ void ulp_riscv_i2c_master_write_to_device(uint8_t *data_wr, size_t size)
|
|||||||
/* Clear the RTC I2C transmission bits */
|
/* Clear the RTC I2C transmission bits */
|
||||||
CLEAR_PERI_REG_MASK(SENS_SAR_I2C_CTRL_REG, SENS_SAR_I2C_START_FORCE);
|
CLEAR_PERI_REG_MASK(SENS_SAR_I2C_CTRL_REG, SENS_SAR_I2C_START_FORCE);
|
||||||
CLEAR_PERI_REG_MASK(SENS_SAR_I2C_CTRL_REG, SENS_SAR_I2C_START);
|
CLEAR_PERI_REG_MASK(SENS_SAR_I2C_CTRL_REG, SENS_SAR_I2C_START);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t ulp_riscv_i2c_master_init(const ulp_riscv_i2c_cfg_t *cfg)
|
esp_err_t ulp_riscv_i2c_master_init(const ulp_riscv_i2c_cfg_t *cfg)
|
||||||
|
Reference in New Issue
Block a user