Skip to content

Commit

Permalink
Merge #19450 #19476
Browse files Browse the repository at this point in the history
19450: cpu/esp32: fix compilation issues with GCC 12.2 r=benpicco a=gschorcht

### Contribution description

This PR provides the changes in `cpu/esp32` and `cpu/esp_common` to fix the compilation issues with GCC v12.2.  It is required as the first step in the preparation of the upgrade to ESP-IDF version 5.1.

**Please note**: Insead of fixing the ESP-IDF 4.4 code itself by a big bunch of patches to fix the compilation problems with GCC v12.2, it temporarily disables some warnings. The reason is that the ESP-IDF 5.1 requires GCC v12.2 and should be fixed for this compiler version by the vendor.

### Testing procedure

Green CI

The change were already tested with all ESP-specific modules like `esp_now`, `esp_wifi`, `esp_spi`  and `esp_ble` for all supported ESP platforms.

### Issues/PRs references

Prerequisite for RIOT-OS/riotdocker#227
Fixes issue #19421

19476: native/syscalls: rename real_clock_gettime to clock_gettime r=benpicco a=Teufelchen1

### Contribution description

When compiling RIOT for native using a recent LLVM and enabling ASAN, one might encounter "Duplicated symbol".

This is due to a name clash with `real_clock_gettime()` in compiler-rt from [LLVM](llvm/llvm-project@f50246d), I renamed RIOTs `real_clock_gettime` and just default to the posix function `clock_gettime`. The wrapper existed, most likely, for consistency only.

(The best solution would probably to convince the LLVM folks to declare their symbol as `static` and refactor a bit)

### Testing procedure

Passing CI should be enough.


Co-authored-by: Gunar Schorcht <gunar@schorcht.net>
Co-authored-by: Teufelchen1 <bennet.blischke@haw-hamburg.de>
  • Loading branch information
3 people authored Apr 17, 2023
3 parents 2b6dc64 + d8d9a9b + 10cada1 commit 812c216
Show file tree
Hide file tree
Showing 26 changed files with 329 additions and 69 deletions.
13 changes: 13 additions & 0 deletions cpu/esp32/Makefile.include
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,13 @@ CFLAGS += -D_CONST=const
# TODO no relaxation yet
ifneq (,$(filter riscv%,$(TARGET_ARCH)))
CFLAGS += -mno-relax -march=rv32imc -mabi=ilp32 -DRISCV_NO_RELAX
GCC_NEW_RISCV_ISA ?= $(shell echo "typedef int dont_be_pedantic;" | \
$(TARGET_ARCH)-gcc -march=rv32imac -mabi=ilp32 \
-misa-spec=2.2 -E - > /dev/null 2>&1 && \
echo 1 || echo 0)
ifeq (1,$(GCC_NEW_RISCV_ISA))
CFLAGS += -misa-spec=2.2
endif
endif

ifneq (,$(filter xtensa%,$(TARGET_ARCH)))
Expand Down Expand Up @@ -243,6 +250,12 @@ endif

LINKFLAGS += -nostdlib -lgcc -Wl,-gc-sections

# all ESP32x SoCs have to load executable code into IRAM
# warning 'LOAD segment with RWX permissions' has to be disabled therefore
ifeq (1,$(GCC_NEW_RISCV_ISA))
LINKFLAGS += -Wl,--no-warn-rwx-segments
endif

# Libraries needed when using esp_wifi_any pseudomodule
ifneq (,$(filter esp_wifi_any,$(USEMODULE)))
LINKFLAGS += -L$(ESP32_SDK_LIB_WIFI_DIR)/$(CPU_FAM)
Expand Down
11 changes: 11 additions & 0 deletions cpu/esp32/bootloader/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -164,13 +164,24 @@ INCLUDES = \
# CONFIG_ESPTOOLPY_FLASHFREQ_* and CONFIG_FLASHMODE_*
CFLAGS = -include '$(RIOTBUILD_CONFIG_HEADER_C)' \

# TODO: required to be able to compile with GCC 12.1, remove them after upgrade to ESP-IDF 5.1
CFLAGS += -Wno-error=format=
CFLAGS += -Wno-format

ifneq (,$(filter riscv32%,$(TARGET_ARCH)))
INCLUDES += -I$(ESP32_SDK_DIR)/components/riscv/include
CFLAGS += -DCONFIG_IDF_TARGET_ARCH_RISCV
CFLAGS += -march=rv32imc
CFLAGS += -Wno-error=format=
CFLAGS += -nostartfiles
CFLAGS += -Wno-format
GCC_NEW_RISCV_ISA ?= $(shell echo "typedef int dont_be_pedantic;" | \
$(TARGET_ARCH)-gcc -march=rv32imac -mabi=ilp32 \
-misa-spec=2.2 -E - > /dev/null 2>&1 && \
echo 1 || echo 0)
ifeq (1,$(GCC_NEW_RISCV_ISA))
CFLAGS += -misa-spec=2.2
endif
endif

ifneq (,$(filter xtensa%,$(TARGET_ARCH)))
Expand Down
15 changes: 15 additions & 0 deletions cpu/esp32/esp-idf/esp_idf_cflags.mk
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,14 @@ CFLAGS += -Wno-enum-compare
# those are false positives.
CFLAGS += -Wno-cast-align

# TODO: required to be able to compile with GCC 12.1, remove them after upgrade to ESP-IDF 5.1
CFLAGS += -Wno-attributes
CFLAGS += -Wno-enum-conversion
CFLAGS += -Wno-error=format=
CFLAGS += -Wno-format
CFLAGS += -Wno-use-after-free
CFLAGS += -Wno-incompatible-pointer-types

# additional CFLAGS required for RISC-V architecture
ifneq (,$(filter riscv32%,$(TARGET_ARCH)))
INCLUDES += -I$(ESP32_SDK_DIR)/components/riscv/include
Expand All @@ -42,4 +50,11 @@ ifneq (,$(filter riscv32%,$(TARGET_ARCH)))
CFLAGS += -Wno-error=format=
CFLAGS += -nostartfiles
CFLAGS += -Wno-format
GCC_NEW_RISCV_ISA ?= $(shell echo "typedef int dont_be_pedantic;" | \
$(TARGET_ARCH)-gcc -march=rv32imac -mabi=ilp32 \
-misa-spec=2.2 -E - > /dev/null 2>&1 && \
echo 1 || echo 0)
ifeq (1,$(GCC_NEW_RISCV_ISA))
CFLAGS += -misa-spec=2.2
endif
endif
2 changes: 1 addition & 1 deletion cpu/esp32/esp-idf/esp_idf_support.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ void IRAM_ATTR esp_log_writev(esp_log_level_t level,
* We use the log level set for the given tag instead of using
* the given log level.
*/
esp_log_level_t act_level = LOG_DEBUG;
esp_log_level_t act_level = (esp_log_level_t)LOG_DEBUG;
size_t i;
for (i = 0; i < ARRAY_SIZE(_log_levels); i++) {
if (strcmp(tag, _log_levels[i].tag) == 0) {
Expand Down
4 changes: 4 additions & 0 deletions cpu/esp32/esp-idf/nvs_flash/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ include ../esp_idf.mk
# those are false positives.
CFLAGS += -Wno-cast-align

# TODO: required to be able to compile with GCC 12.1, remove them after upgrade to ESP-IDF 5.1
CFLAGS += -Wno-error=format=
CFLAGS += -Wno-format

# additional CFLAGS required for RISC-V architecture
ifneq (,$(filter riscv32%,$(TARGET_ARCH)))
CFLAGS += -Wno-error=format=
Expand Down
10 changes: 0 additions & 10 deletions cpu/esp32/include/periph_cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -212,16 +212,6 @@ typedef enum {
#define GPIO_DRIVE_20 GPIO_DRIVE_STRONG /**< 20 mA (default) */
#define GPIO_DRIVE_30 GPIO_DRIVE_STRONGEST /**< 30 mA */

#define HAVE_GPIO_IRQ_TRIG_T
typedef enum {
GPIO_TRIGGER_NONE = 0,
GPIO_TRIGGER_EDGE_RISING = 1,
GPIO_TRIGGER_EDGE_FALLING = 2,
GPIO_TRIGGER_EDGE_BOTH = 3,
GPIO_TRIGGER_LEVEL_LOW = 4,
GPIO_TRIGGER_LEVEL_HIGH = 5
} gpio_irq_trig_t;

/* END: GPIO LL overwrites */

#endif /* ndef DOXYGEN */
Expand Down
26 changes: 20 additions & 6 deletions cpu/esp32/periph/adc.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,16 +131,22 @@ int adc_init(adc_t line)
}

if (_adc_hw[rtcio].adc_ctrl == ADC_UNIT_1) {
/* ensure compatibility of given adc_channel_t with adc1_channel_t */
assert(_adc_hw[rtcio].adc_channel < (adc_channel_t)ADC1_CHANNEL_MAX);
/* initialize the ADC1 unit if needed */
_adc1_ctrl_init();
/* set the attenuation and configure its associated GPIO pin mux */
adc1_config_channel_atten(_adc_hw[rtcio].adc_channel, ADC_ATTEN_DB_11);
adc1_config_channel_atten((adc1_channel_t)_adc_hw[rtcio].adc_channel,
ADC_ATTEN_DB_11);
}
else if (_adc_hw[rtcio].adc_ctrl == ADC_UNIT_2) {
/* ensure compatibility of given adc_channel_t with adc2_channel_t */
assert(_adc_hw[rtcio].adc_channel < (adc_channel_t)ADC2_CHANNEL_MAX);
/* initialize the ADC2 unit if needed */
_adc2_ctrl_init();
/* set the attenuation and configure its associated GPIO pin mux */
adc2_config_channel_atten(_adc_hw[rtcio].adc_channel, ADC_ATTEN_DB_11);
adc2_config_channel_atten((adc2_channel_t)_adc_hw[rtcio].adc_channel,
ADC_ATTEN_DB_11);
}
else {
return -1;
Expand All @@ -165,13 +171,17 @@ int32_t adc_sample(adc_t line, adc_res_t res)

if (_adc_hw[rtcio].adc_ctrl == ADC_UNIT_1) {
adc1_config_width(_adc_esp_res_map[res].res);
raw = adc1_get_raw(_adc_hw[rtcio].adc_channel);
/* ensure compatibility of given adc_channel_t with adc1_channel_t */
assert(_adc_hw[rtcio].adc_channel < (adc_channel_t)ADC1_CHANNEL_MAX);
raw = adc1_get_raw((adc1_channel_t)_adc_hw[rtcio].adc_channel);
if (raw < 0) {
return -1;
}
}
else if (_adc_hw[rtcio].adc_ctrl == ADC_UNIT_2) {
if (adc2_get_raw(_adc_hw[rtcio].adc_channel,
/* ensure compatibility of given adc_channel_t with adc2_channel_t */
assert(_adc_hw[rtcio].adc_channel < (adc_channel_t)ADC2_CHANNEL_MAX);
if (adc2_get_raw((adc2_channel_t)_adc_hw[rtcio].adc_channel,
_adc_esp_res_map[res].res, &raw) < 0) {
return -1;
}
Expand All @@ -189,10 +199,14 @@ int adc_set_attenuation(adc_t line, adc_atten_t atten)
assert(rtcio != RTCIO_NA);

if (_adc_hw[rtcio].adc_ctrl == ADC_UNIT_1) {
return adc1_config_channel_atten(_adc_hw[rtcio].adc_channel, atten);
/* ensure compatibility of given adc_channel_t with adc1_channel_t */
assert(_adc_hw[rtcio].adc_channel < (adc_channel_t)ADC1_CHANNEL_MAX);
return adc1_config_channel_atten((adc1_channel_t)_adc_hw[rtcio].adc_channel, atten);
}
else if (_adc_hw[rtcio].adc_ctrl == ADC_UNIT_2) {
return adc2_config_channel_atten(_adc_hw[rtcio].adc_channel, atten);
/* ensure compatibility of given adc_channel_t with adc2_channel_t */
assert(_adc_hw[rtcio].adc_channel < (adc_channel_t)ADC2_CHANNEL_MAX);
return adc2_config_channel_atten((adc2_channel_t)_adc_hw[rtcio].adc_channel, atten);
}

return -1;
Expand Down
4 changes: 2 additions & 2 deletions cpu/esp32/periph/flashpage.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ void IRAM_ATTR esp_flashpage_init(void)
p_addr, 64, p_numof, 0);
Cache_Resume_ICache(autoload);

DEBUG("%s DCache MMU set paddr=%08x vaddr=%08x size=%d n=%u\n", __func__,
p_addr, (uint32_t)&_fp_mem_start, CONFIG_ESP_FLASHPAGE_CAPACITY,
DEBUG("%s DCache MMU set paddr=%08"PRIx32" vaddr=%08"PRIx32" size=%d n=%"PRIu32"\n",
__func__, p_addr, (uint32_t)&_fp_mem_start, CONFIG_ESP_FLASHPAGE_CAPACITY,
p_numof);

if (res != ESP_OK) {
Expand Down
4 changes: 2 additions & 2 deletions cpu/esp32/periph/gpio.c
Original file line number Diff line number Diff line change
Expand Up @@ -229,8 +229,8 @@ int gpio_init(gpio_t pin, gpio_mode_t mode)
(mode == GPIO_OD_PU) ||
(mode == GPIO_IN_OD_PU)) ? GPIO_PULLUP_ENABLE
: GPIO_PULLUP_DISABLE;
cfg.pull_down_en = (mode == GPIO_IN_PD) ? GPIO_PULLUP_ENABLE
: GPIO_PULLUP_DISABLE;
cfg.pull_down_en = (mode == GPIO_IN_PD) ? GPIO_PULLDOWN_ENABLE
: GPIO_PULLDOWN_DISABLE;
cfg.intr_type = GPIO_INTR_DISABLE;

#ifdef ESP_PM_WUP_PINS
Expand Down
20 changes: 18 additions & 2 deletions cpu/esp32/periph/gpio_ll.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,9 +149,25 @@ int gpio_ll_init(gpio_port_t port, uint8_t pin, const gpio_conf_t *conf)
}

/* if output pin, try to set drive strength */
gpio_drive_cap_t strength;
switch (conf->drive_strength) {
case GPIO_DRIVE_WEAKEST:
strength = GPIO_DRIVE_CAP_0;
break;
case GPIO_DRIVE_WEAK:
strength = GPIO_DRIVE_CAP_1;
break;
case GPIO_DRIVE_STRONG:
strength = GPIO_DRIVE_CAP_2;
break;
case GPIO_DRIVE_STRONGEST:
strength = GPIO_DRIVE_CAP_3;
break;
default:
strength = GPIO_DRIVE_CAP_DEFAULT;
}
if ((cfg.pin_bit_mask & SOC_GPIO_VALID_OUTPUT_GPIO_MASK) &&
(esp_idf_gpio_set_drive_capability(gpio,
conf->drive_strength) != ESP_OK)) {
(esp_idf_gpio_set_drive_capability(gpio, strength) != ESP_OK)) {
return -ENOTSUP;
}

Expand Down
22 changes: 21 additions & 1 deletion cpu/esp32/periph/gpio_ll_irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,27 @@ int gpio_ll_irq(gpio_port_t port, uint8_t pin, gpio_irq_trig_t trig,
gpio_isr_service_installed = true;

/* set the interrupt type for the pin */
if (esp_idf_gpio_set_intr_type(gpio, trig) != ESP_OK) {
gpio_int_type_t type;
switch (trig) {
case GPIO_TRIGGER_EDGE_FALLING:
type = GPIO_INTR_NEGEDGE;
break;
case GPIO_TRIGGER_EDGE_RISING:
type = GPIO_INTR_POSEDGE;
break;
case GPIO_TRIGGER_EDGE_BOTH:
type = GPIO_INTR_ANYEDGE;
break;
case GPIO_TRIGGER_LEVEL_HIGH:
type = GPIO_INTR_HIGH_LEVEL;
break;
case GPIO_TRIGGER_LEVEL_LOW:
type = GPIO_INTR_LOW_LEVEL;
break;
default:
type = GPIO_INTR_DISABLE;
}
if (esp_idf_gpio_set_intr_type(gpio, type) != ESP_OK) {
return -1;
}

Expand Down
2 changes: 1 addition & 1 deletion cpu/esp32/periph/rtt.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ extern uint32_t rtc_clk_slow_freq_get_hz(void);
/* forward declaration of functions */
void rtt_restore_counter(bool sys_time);
static void _rtt_update_hw_alarm(void);
static void IRAM_ATTR _rtt_isr(void *arg);
static void _rtt_isr(void *arg);

/* forward declarations of driver functions */
uint64_t _rtc_get_counter(void);
Expand Down
5 changes: 0 additions & 5 deletions cpu/esp32/periph/rtt_hw_rtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,13 +135,8 @@ static void _rtc_set_alarm(uint32_t alarm, rtt_cb_t cb, void *arg)
RTCCNTL.slp_timer0 = rtc_alarm & 0xffffffff;
RTCCNTL.slp_timer1.slp_val_hi = rtc_alarm >> 32;

#if __xtensa__
DEBUG("%s %08x%08x \n", __func__,
RTCCNTL.slp_timer1.slp_val_hi, RTCCNTL.slp_timer0);
#else
DEBUG("%s %08x%08x \n", __func__,
(unsigned)RTCCNTL.slp_timer1.slp_val_hi, (unsigned)RTCCNTL.slp_timer0);
#endif

/* enable RTC timer alarm */
RTCCNTL.slp_timer1.main_timer_alarm_en = 1;
Expand Down
4 changes: 2 additions & 2 deletions cpu/esp32/startup.c
Original file line number Diff line number Diff line change
Expand Up @@ -240,8 +240,8 @@ static NORETURN void IRAM system_init (void)

/* set log levels for SDK library outputs */
extern void esp_log_level_set(const char* tag, esp_log_level_t level);
esp_log_level_set("wifi", LOG_DEBUG);
esp_log_level_set("gpio", LOG_DEBUG);
esp_log_level_set("wifi", (esp_log_level_t)LOG_DEBUG);
esp_log_level_set("gpio", (esp_log_level_t)LOG_DEBUG);

/* init watchdogs */
system_wdt_init();
Expand Down
5 changes: 3 additions & 2 deletions cpu/esp32/syscalls.c
Original file line number Diff line number Diff line change
Expand Up @@ -382,8 +382,9 @@ void system_wdt_init(void)
wdt_hal_write_protect_enable(&rwdt);

#if defined(CPU_FAM_ESP32)
DEBUG("%s TIMERG0 wdtconfig0=%08x wdtconfig1=%08x wdtconfig2=%08x "
"wdtconfig3=%08x wdtconfig4=%08x regclk=%08x\n", __func__,
DEBUG("%s TIMERG0 wdtconfig0=%08"PRIx32" wdtconfig1=%08"PRIx32
" wdtconfig2=%08"PRIx32" wdtconfig3=%08"PRIx32
" wdtconfig4=%08"PRIx32" regclk=%08"PRIx32"\n", __func__,
TIMERG0.wdt_config0.val, TIMERG0.wdt_config1.val,
TIMERG0.wdt_config2, TIMERG0.wdt_config3,
TIMERG0.wdt_config4, TIMERG0.clk.val);
Expand Down
10 changes: 5 additions & 5 deletions cpu/esp_common/esp-now/esp_now_netdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ static bool _esp_now_add_peer(const uint8_t* bssid, uint8_t channel, const uint8

memcpy(peer.peer_addr, bssid, ESP_NOW_ETH_ALEN);
peer.channel = channel;
peer.ifidx = ESP_IF_WIFI_AP;
peer.ifidx = WIFI_IF_AP;

if (esp_now_params.key) {
peer.encrypt = true;
Expand Down Expand Up @@ -391,13 +391,13 @@ esp_now_netdev_t *netdev_esp_now_setup(void)
}

/* set the Station and SoftAP configuration */
result = esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config_sta);
result = esp_wifi_set_config(WIFI_IF_STA, &wifi_config_sta);
if (result != ESP_OK) {
LOG_TAG_ERROR("esp_now", "esp_wifi_set_config station failed with "
"return value %d\n", result);
return NULL;
}
result = esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config_ap);
result = esp_wifi_set_config(WIFI_IF_AP, &wifi_config_ap);
if (result != ESP_OK) {
LOG_TAG_ERROR("esp_now",
"esp_wifi_set_config softap failed with return value %d\n",
Expand All @@ -416,7 +416,7 @@ esp_now_netdev_t *netdev_esp_now_setup(void)

#if !ESP_NOW_UNICAST
/* all ESP-NOW nodes get the shared mac address on their station interface */
esp_wifi_set_mac(ESP_IF_WIFI_STA, (uint8_t*)_esp_now_mac);
esp_wifi_set_mac(WIFI_IF_STA, (uint8_t*)_esp_now_mac);
#endif

#endif /* MODULE_ESP_WIFI */
Expand Down Expand Up @@ -471,7 +471,7 @@ int esp_now_set_channel(uint8_t channel)
/* channel is controlled by `esp_now`, try to reconfigure SoftAP */
uint8_t old_channel = wifi_config_ap.ap.channel;
wifi_config_ap.ap.channel = channel;
esp_err_t result = esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config_ap);
esp_err_t result = esp_wifi_set_config(WIFI_IF_AP, &wifi_config_ap);
if (result != ESP_OK) {
LOG_TAG_ERROR("esp_now",
"esp_wifi_set_config softap failed with return value %d\n",
Expand Down
Loading

0 comments on commit 812c216

Please sign in to comment.