diff --git a/hal/inc/hal_dynalib_i2c.h b/hal/inc/hal_dynalib_i2c.h index a7f51c214d..421859dab0 100644 --- a/hal/inc/hal_dynalib_i2c.h +++ b/hal/inc/hal_dynalib_i2c.h @@ -87,6 +87,7 @@ DYNALIB_FN(BASE_IDX + 18, hal_i2c, hal_i2c_lock, int32_t(hal_i2c_interface_t, vo DYNALIB_FN(BASE_IDX + 19, hal_i2c, hal_i2c_unlock, int32_t(hal_i2c_interface_t, void*)) DYNALIB_FN(BASE_IDX + 20, hal_i2c, hal_i2c_request_ex, int32_t(hal_i2c_interface_t, const hal_i2c_transmission_config_t*, void*)) DYNALIB_FN(BASE_IDX + 21, hal_i2c, hal_i2c_sleep, int(hal_i2c_interface_t i2c, bool sleep, void* reserved)) +DYNALIB_FN(BASE_IDX + 22, hal_i2c, hal_i2c_get_config, bool(hal_i2c_interface_t, hal_i2c_config_t*, void*)) DYNALIB_END(hal_i2c) diff --git a/hal/inc/i2c_hal.h b/hal/inc/i2c_hal.h index 673afd1873..2153935fd3 100644 --- a/hal/inc/i2c_hal.h +++ b/hal/inc/i2c_hal.h @@ -100,6 +100,7 @@ int32_t hal_i2c_available(hal_i2c_interface_t i2c, void* reserved); int32_t hal_i2c_read(hal_i2c_interface_t i2c, void* reserved); int32_t hal_i2c_peek(hal_i2c_interface_t i2c, void* reserved); void hal_i2c_flush(hal_i2c_interface_t i2c, void* reserved); +bool hal_i2c_get_config(hal_i2c_interface_t i2c, hal_i2c_config_t* config, void* reserved); bool hal_i2c_is_enabled(hal_i2c_interface_t i2c, void* reserved); void hal_i2c_set_callback_on_received(hal_i2c_interface_t i2c, void (*function)(int), void* reserved); void hal_i2c_set_callback_on_requested(hal_i2c_interface_t i2c, void (*function)(void), void* reserved); diff --git a/hal/src/nRF52840/i2c_hal.cpp b/hal/src/nRF52840/i2c_hal.cpp index 6a6eb348d7..0ee3f77234 100644 --- a/hal/src/nRF52840/i2c_hal.cpp +++ b/hal/src/nRF52840/i2c_hal.cpp @@ -604,6 +604,17 @@ void hal_i2c_flush(hal_i2c_interface_t i2c, void* reserved) { i2cMap[i2c].tx_index_tail = 0; } +bool hal_i2c_get_config(hal_i2c_interface_t i2c, hal_i2c_config_t* config, void* reserved) { + if (i2c >= HAL_PLATFORM_I2C_NUM) { + return false; + } + config->rx_buffer = i2cMap[i2c].rx_buf; + config->rx_buffer_size = i2cMap[i2c].rx_buf_size; + config->tx_buffer = i2cMap[i2c].tx_buf; + config->tx_buffer_size = i2cMap[i2c].tx_buf_size; + return true; +} + bool hal_i2c_is_enabled(hal_i2c_interface_t i2c,void* reserved) { return i2cMap[i2c].state == HAL_I2C_STATE_ENABLED; } diff --git a/hal/src/stm32f2xx/i2c_hal.c b/hal/src/stm32f2xx/i2c_hal.c index bc466a9ac8..575ab1d4d2 100644 --- a/hal/src/stm32f2xx/i2c_hal.c +++ b/hal/src/stm32f2xx/i2c_hal.c @@ -826,6 +826,14 @@ void hal_i2c_flush(hal_i2c_interface_t i2c, void* reserved) { // XXX: to be implemented. } +bool hal_i2c_get_config(hal_i2c_interface_t i2c, hal_i2c_config_t* config, void* reserved) { + config->rx_buffer = i2cMap[i2c]->rxBuffer; + config->rx_buffer_size = i2cMap[i2c]->rxBufferSize; + config->tx_buffer = i2cMap[i2c]->txBuffer; + config->tx_buffer_size = i2cMap[i2c]->txBufferSize; + return true; +} + bool hal_i2c_is_enabled(hal_i2c_interface_t i2c, void* reserved) { return i2cMap[i2c]->state == HAL_I2C_STATE_ENABLED; } diff --git a/hal/src/template/i2c_hal.cpp b/hal/src/template/i2c_hal.cpp index 34c8c58d88..6e22152e90 100644 --- a/hal/src/template/i2c_hal.cpp +++ b/hal/src/template/i2c_hal.cpp @@ -93,6 +93,11 @@ void hal_i2c_flush(hal_i2c_interface_t i2c,void* reserved) // XXX: to be implemented. } +bool hal_i2c_get_config(hal_i2c_interface_t i2c, hal_i2c_config_t* config, void* reserved) +{ + return false; +} + bool hal_i2c_is_enabled(hal_i2c_interface_t i2c,void* reserved) { return false; diff --git a/wiring/inc/spark_wiring_i2c.h b/wiring/inc/spark_wiring_i2c.h index 96887cce41..90805b54ac 100644 --- a/wiring/inc/spark_wiring_i2c.h +++ b/wiring/inc/spark_wiring_i2c.h @@ -114,6 +114,8 @@ class TwoWire : public Stream virtual int read(void); virtual int peek(void); virtual void flush(void); + size_t rxBufferSize(void); + size_t txBufferSize(void); void onReceive(void (*)(int)); void onRequest(void (*)(void)); diff --git a/wiring/src/spark_wiring_i2c.cpp b/wiring/src/spark_wiring_i2c.cpp index 2f32bce179..566abe8617 100644 --- a/wiring/src/spark_wiring_i2c.cpp +++ b/wiring/src/spark_wiring_i2c.cpp @@ -182,6 +182,24 @@ void TwoWire::flush(void) hal_i2c_flush(_i2c, NULL); } +size_t TwoWire::rxBufferSize(void) +{ + hal_i2c_config_t config; + if (hal_i2c_get_config(_i2c, &config, NULL)) { + return config.rx_buffer_size; + } + return 0; +} + +size_t TwoWire::txBufferSize(void) +{ + hal_i2c_config_t config; + if (hal_i2c_get_config(_i2c, &config, NULL)) { + return config.tx_buffer_size; + } + return 0; +} + // sets function called on slave write void TwoWire::onReceive( void (*function)(int) ) {