Skip to content

Commit

Permalink
Merge branch 'bugfix/fix_newlib_nano_float_printf_issues' into 'master'
Browse files Browse the repository at this point in the history
fix(esp_rom): add new rom caps ESP_ROM_HAS_NEWLIB_PRINTF_BUG

See merge request espressif/esp-idf!30956
  • Loading branch information
jack0c committed Jul 26, 2024
2 parents 27c562a + 5e283e0 commit e37ff35
Show file tree
Hide file tree
Showing 8 changed files with 24 additions and 2 deletions.
2 changes: 1 addition & 1 deletion components/esp_rom/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ else() # Regular app build
rom_linker_script("newlib")

if(CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT AND CONFIG_NEWLIB_NANO_FORMAT)
if(NOT CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME)
if(NOT CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME AND NOT CONFIG_ESP_ROM_HAS_NEWLIB_NANO_PRINTF_FLOAT_BUG)
# Newlib-nano functions contains time_t related functions
# and cannot be used if they were compiled with 32 bit time_t
rom_linker_script("newlib-nano")
Expand Down
4 changes: 4 additions & 0 deletions components/esp_rom/esp32c61/Kconfig.soc_caps.in
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ config ESP_ROM_HAS_NEWLIB_NANO_FORMAT
bool
default y

config ESP_ROM_HAS_NEWLIB_NANO_PRINTF_FLOAT_BUG
bool
default y

config ESP_ROM_HAS_VERSION
bool
default y
Expand Down
1 change: 1 addition & 0 deletions components/esp_rom/esp32c61/esp_rom_caps.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
// #define ESP_ROM_HAS_REGI2C_BUG (1) // ROM has the regi2c bug
#define ESP_ROM_HAS_NEWLIB (1) // ROM has newlib (at least parts of it) functions included
#define ESP_ROM_HAS_NEWLIB_NANO_FORMAT (1) // ROM has the newlib nano version of formatting functions
#define ESP_ROM_HAS_NEWLIB_NANO_PRINTF_FLOAT_BUG (1) // ROM has the printf float bug with newlib nano version
#define ESP_ROM_HAS_VERSION (1) // ROM has version/eco information
#define ESP_ROM_WDT_INIT_PATCH (1) // ROM version does not configure the clock
#define ESP_ROM_RAM_APP_NEEDS_MMU_INIT (1) // ROM doesn't init cache MMU when it's a RAM APP, needs MMU hal to init
Expand Down
4 changes: 4 additions & 0 deletions components/esp_rom/esp32h2/Kconfig.soc_caps.in
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ config ESP_ROM_HAS_NEWLIB_NANO_FORMAT
bool
default y

config ESP_ROM_HAS_NEWLIB_NANO_PRINTF_FLOAT_BUG
bool
default y

config ESP_ROM_WDT_INIT_PATCH
bool
default y
Expand Down
1 change: 1 addition & 0 deletions components/esp_rom/esp32h2/esp_rom_caps.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#define ESP_ROM_WITHOUT_REGI2C (1) // ROM has no regi2c APIs
#define ESP_ROM_HAS_NEWLIB (1) // ROM has newlib (at least parts of it) functions included
#define ESP_ROM_HAS_NEWLIB_NANO_FORMAT (1) // ROM has the newlib nano versions of formatting functions
#define ESP_ROM_HAS_NEWLIB_NANO_PRINTF_FLOAT_BUG (1) // ROM has the printf float bug with newlib nano version
#define ESP_ROM_WDT_INIT_PATCH (1) // ROM version does not configure the clock
#define ESP_ROM_NEEDS_SET_CACHE_MMU_SIZE (1) // ROM needs to set cache MMU size according to instruction and rodata for flash mmap
#define ESP_ROM_RAM_APP_NEEDS_MMU_INIT (1) // ROM doesn't init cache MMU when it's a RAM APP, needs MMU hal to init
Expand Down
4 changes: 4 additions & 0 deletions components/esp_rom/esp32p4/Kconfig.soc_caps.in
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ config ESP_ROM_HAS_NEWLIB_NANO_FORMAT
bool
default y

config ESP_ROM_HAS_NEWLIB_NANO_PRINTF_FLOAT_BUG
bool
default y

config ESP_ROM_HAS_VERSION
bool
default y
Expand Down
1 change: 1 addition & 0 deletions components/esp_rom/esp32p4/esp_rom_caps.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#define ESP_ROM_WITHOUT_REGI2C (1) // ROM has no regi2c APIs
#define ESP_ROM_HAS_NEWLIB (1) // ROM has newlib (at least parts of it) functions included
#define ESP_ROM_HAS_NEWLIB_NANO_FORMAT (1) // ROM has the newlib nano version of formatting functions
#define ESP_ROM_HAS_NEWLIB_NANO_PRINTF_FLOAT_BUG (1) // ROM has the printf float bug with newlib nano version
#define ESP_ROM_HAS_VERSION (1) // ROM has version/eco information
#define ESP_ROM_CLIC_INT_TYPE_PATCH (1) // ROM api esprv_intc_int_set_type configuring edge type interrupt is invalid
#define ESP_ROM_HAS_OUTPUT_PUTC_FUNC (1) // ROM has esp_rom_output_putc (or ets_write_char_uart)
9 changes: 8 additions & 1 deletion components/newlib/test_apps/newlib/main/test_newlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ static bool fn_in_rom(void *fn)
/* Older chips have newlib nano in rom as well, but this is not linked in due to us now using 64 bit time_t
and the ROM code was compiled for 32 bit.
*/
#define PRINTF_NANO_IN_ROM (CONFIG_NEWLIB_NANO_FORMAT && (CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4))
#define PRINTF_NANO_IN_ROM (CONFIG_NEWLIB_NANO_FORMAT && CONFIG_IDF_TARGET_ESP32C2)
#define SSCANF_NANO_IN_ROM (CONFIG_NEWLIB_NANO_FORMAT && CONFIG_IDF_TARGET_ESP32C2)

TEST_CASE("check if ROM or Flash is used for functions", "[newlib]")
Expand Down Expand Up @@ -230,3 +230,10 @@ TEST_CASE("newlib: rom and toolchain localtime func gives the same result", "[ne
printf("%s\n", test_result);
TEST_ASSERT_EQUAL_STRING("2020-03-12 15:00:00 EDT (tm_isdst = 1)", test_result);
}

TEST_CASE("newlib: printf float as expected", "[newlib]")
{
const float val = 1.23;
int len = printf("test printf float val is %1.2f\n", val);
TEST_ASSERT_EQUAL_INT(30, len);
}

0 comments on commit e37ff35

Please sign in to comment.