Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Undefined reference to phy_bbpll_en_usb when using USB CDC and WiFi at the same time on ESP32-S2 (IDFGH-10996) #12185

Closed
3 tasks done
Strat00s opened this issue Sep 3, 2023 · 6 comments
Assignees
Labels
Resolution: NA Issue resolution is unavailable Status: Done Issue is done internally Type: Bug bugs in IDF

Comments

@Strat00s
Copy link

Strat00s commented Sep 3, 2023

Answers checklist.

  • I have read the documentation ESP-IDF Programming Guide and the issue is not addressed there.
  • I have updated my IDF branch (master or release) to the latest version and checked that the issue is present there.
  • I have searched the issue tracker for a similar issue and not found a similar issue.

IDF version.

V4.4.5, V5.1.1, master

Operating System used.

Windows

How did you build your project?

VS Code IDE

If you are using Windows, please specify command line type.

None

What is the expected behavior?

It should compile.

What is the actual behavior?

Looks like S2 is missing phy_bbpll_en_usb implementation as all I get is undefined reference to 'phy_bbpll_en_usb'.

Steps to reproduce.

  1. Have ESP32-S2
  2. Create wifi station or scan example (probably any wifi example will do, I tried just these 2).
  3. Enable USB when phy init, set USB CDC for console output.
  4. Try and build it.

Build or installation Logs.

[1/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s2/bootloader_soc.c.obj
[2/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console_loader.c.obj
[3/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s2/bootloader_sha.c.obj
[4/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_panic.c.obj
[5/111] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s2/esp_efuse_fields.c.obj
[6/111] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s2/esp_efuse_table.c.obj
[7/111] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s2/esp_efuse_rtc_calib.c.obj
[8/111] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s2/esp_efuse_rtc_table.c.obj
[9/111] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s2/rtc_sleep.c.obj
[10/111] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/log.c.obj
[11/111] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s2/rtc_clk_init.c.obj
[12/111] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s2/rtc_init.c.obj
[13/111] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s2/esp_efuse_utility.c.obj
[14/111] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_utility.c.obj
[15/111] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_fields.c.obj
[16/111] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_api.c.obj
[17/111] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/efuse_controller/keys/with_key_purposes/esp_efuse_api_key.c.obj
[18/111] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/cpu.c.obj
[19/111] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_err.c.obj
[20/111] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_memory_utils.c.obj
[21/111] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s2/cpu_region_protect.c.obj
[22/111] Generating project_elf_src_esp32s2.c
[23/111] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xt_trax.c.obj
[24/111] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/eri.c.obj
[25/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/lldesc.c.obj
[26/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/dport_access_common.c.obj
[27/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/interrupts.c.obj
[28/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/gpio_periph.c.obj
[29/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/spi_periph.c.obj
[30/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s2/bootloader_esp32s2.c.obj
[31/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/adc_periph.c.obj
[32/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/uart_periph.c.obj
[33/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/dedic_gpio_periph.c.obj
[34/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/ledc_periph.c.obj
[35/111] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s2/rtc_clk.c.obj
[36/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/i2s_periph.c.obj
[37/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/i2c_periph.c.obj
[38/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/sdm_periph.c.obj
[39/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/pcnt_periph.c.obj
[40/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/rmt_periph.c.obj
[41/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/temperature_sensor_periph.c.obj
[42/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/timer_periph.c.obj
[43/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/mpi_periph.c.obj
[44/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/lcd_periph.c.obj
[45/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/touch_sensor_periph.c.obj
[46/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/twai_periph.c.obj
[47/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/usb_periph.c.obj
[48/111] Building C object CMakeFiles/bootloader.elf.dir/project_elf_src_esp32s2.c.obj
[49/111] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpu_hal.c.obj
[50/111] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/efuse_hal.c.obj
[51/111] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s2/efuse_hal.c.obj
[52/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/rtc_io_periph.c.obj
[53/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/dac_periph.c.obj
[54/111] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s2/usb_otg_periph.c.obj
[55/111] Building C object esp-idf/esp_bootloader_format/CMakeFiles/__idf_esp_bootloader_format.dir/esp_bootloader_desc.c.obj
[56/111] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mmu_hal.c.obj
[57/111] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cache_hal.c.obj
[58/111] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/wdt_hal_iram.c.obj
[59/111] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_wrap.c.obj
[60/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common.c.obj
[61/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_init.c.obj
[62/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common_loader.c.obj
[63/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_efuse.c.obj
[64/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random_esp32s2.c.obj
[65/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_mem.c.obj
[66/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random.c.obj
[67/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_encrypt.c.obj
[68/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/secure_boot.c.obj
[69/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_loader.c.obj
[70/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console.c.obj
[71/111] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_esp32s2_esp32s3.c.obj
[72/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_partitions.c.obj
[73/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash_config_esp32s2.c.obj
[74/111] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_sys.c.obj
[75/111] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/esp32s2/usb_patches.c.obj
[76/111] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s2/chip_info.c.obj
[77/111] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_spiflash.c.obj
[78/111] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_systimer.c.obj
[79/111] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s2/rtc_time.c.obj
[80/111] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_crc.c.obj
[81/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash.c.obj
[82/111] Building C object esp-idf/esp_common/CMakeFiles/__idf_esp_common.dir/src/esp_err_to_name.c.obj
[83/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_init.c.obj
[84/111] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_efuse.c.obj
[85/111] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_longjmp.S.obj
[86/111] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_regi2c_esp32s2.c.obj
[87/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/flash_qio_mode.c.obj
[88/111] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_uart.c.obj
[89/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_utility.c.obj
[90/111] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/log_noos.c.obj
[91/111] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/bootloader_start.c.obj
[92/111] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/log_buffers.c.obj
[93/111] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp_image_format.c.obj
[94/111] Building C object esp-idf/micro-ecc/CMakeFiles/__idf_micro-ecc.dir/uECC_verify_antifault.c.obj
[95/111] Linking C static library esp-idf\log\liblog.a
[96/111] Linking C static library esp-idf\esp_rom\libesp_rom.a
[97/111] Linking C static library esp-idf\esp_common\libesp_common.a
[98/111] Linking C static library esp-idf\esp_hw_support\libesp_hw_support.a
[99/111] Linking C static library esp-idf\esp_system\libesp_system.a
[100/111] Linking C static library esp-idf\efuse\libefuse.a
[101/111] Linking C static library esp-idf\bootloader_support\libbootloader_support.a
[102/111] Linking C static library esp-idf\esp_bootloader_format\libesp_bootloader_format.a
[103/111] Linking C static library esp-idf\spi_flash\libspi_flash.a
[104/111] Linking C static library esp-idf\hal\libhal.a
[105/111] Linking C static library esp-idf\micro-ecc\libmicro-ecc.a
[106/111] Linking C static library esp-idf\soc\libsoc.a
[107/111] Linking C static library esp-idf\xtensa\libxtensa.a
[108/111] Linking C static library esp-idf\main\libmain.a
[109/111] Linking C executable bootloader.elf
[110/111] Generating binary image from built executable
esptool.py v4.7.dev1
Creating esp32s2 image...
Merged 2 ELF sections
Successfully created esp32s2 image.
Generated C:/Users/Stratos/Desktop/wifi_tests/station/build/bootloader/bootloader.bin
[111/111] cmd.exe /C "cd /D C:\Users\Stratos\Desktop\wifi_tests\station\build\bootloader\esp-idf\esptool_py && C:\Users\Stratos\Espressif\master\tools\python_env\idf5.2_py3.11_env\Scripts\python.exe C:/Users/Stratos/Espressif/master/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x1000 C:/Users/Stratos/Desktop/wifi_tests/station/build/bootloader/bootloader.bin"       
Bootloader binary size 0x5650 bytes. 0x19b0 bytes (23%) free.
[916/918] Linking CXX executable wifi_station.elf
FAILED: wifi_station.elf
cmd.exe /C "cd . && C:\Users\Stratos\Espressif\master\tools\tools\xtensa-esp32s2-elf\esp-12.2.0_20230208\xtensa-esp32s2-elf\bin\xtensa-esp32s2-elf-g++.exe -mlongcalls -Wl,--cref -Wl,--defsym=IDF_TARGET_ESP32S2=0 -Wl,--Map=C:/Users/Stratos/Desktop/wifi_tests/station/build/wifi_station.map -Wl,--no-warn-rwx-segments -fno-rtti -fno-lto -Wl,--gc-sections -Wl,--warn-common -T esp32s2.peripherals.ld -T esp32s2.rom.ld -T esp32s2.rom.api.ld -T esp32s2.rom.libgcc.ld -T esp32s2.rom.newlib-funcs.ld -T esp32s2.rom.newlib-data.ld -T esp32s2.rom.spiflash.ld -T memory.ld -T sections.ld @CMakeFiles\wifi_station.elf.rsp -o wifi_station.elf  && cd ."
c:/users/stratos/espressif/master/tools/tools/xtensa-esp32s2-elf/esp-12.2.0_20230208/xtensa-esp32s2-elf/bin/../lib/gcc/xtensa-esp32s2-elf/12.2.0/../../../../xtensa-esp32s2-elf/bin/ld.exe: esp-idf/esp_phy/libesp_phy.a(phy_init.c.obj):(.literal.esp_phy_load_cal_and_init+0x28): undefined reference to `phy_bbpll_en_usb'
c:/users/stratos/espressif/master/tools/tools/xtensa-esp32s2-elf/esp-12.2.0_20230208/xtensa-esp32s2-elf/bin/../lib/gcc/xtensa-esp32s2-elf/12.2.0/../../../../xtensa-esp32s2-elf/bin/ld.exe: esp-idf/esp_phy/libesp_phy.a(phy_init.c.obj): in function `esp_phy_load_cal_and_init':
C:/Users/Stratos/Espressif/master/esp-idf/components/esp_phy/src/phy_init.c:788: undefined reference to `phy_bbpll_en_usb'
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

More Information.

#12106 (comment)
#7404 (comment)

@Strat00s Strat00s added the Type: Bug bugs in IDF label Sep 3, 2023
@espressif-bot espressif-bot added the Status: Opened Issue is new label Sep 3, 2023
@github-actions github-actions bot changed the title Undefined reference to phy_bbpll_en_usb when using USB CDC and WiFi at the same time on ESP32-S2 Undefined reference to phy_bbpll_en_usb when using USB CDC and WiFi at the same time on ESP32-S2 (IDFGH-10996) Sep 3, 2023
@colinb2048
Copy link

I encountered this same issue recently here, #12106

@Strat00s
Copy link
Author

Strat00s commented Sep 4, 2023

Probably found a workaround. Untick the Enable USB when phy init and enable TinyUSB stack and tick Enable TinyUSB CDC feature.

Edit: Although it seems that the VSCode extension does not like the tinyusb stack for uploading as it always fails.
Edit 2: Scrap that. Seems that just unticking Enable USB when phy init is enough.

@espressif-bot espressif-bot added Status: Selected for Development Issue is selected for development and removed Status: Opened Issue is new labels Sep 26, 2023
@espressif-bot espressif-bot added Status: In Progress Work is in progress and removed Status: Selected for Development Issue is selected for development labels Nov 21, 2023
@espressif-bot espressif-bot added Status: Reviewing Issue is being reviewed and removed Status: In Progress Work is in progress labels Nov 23, 2023
@tore-espressif
Copy link
Collaborator

Hello @Strat00s ,
You're right and I'm sorry about the problem.

The phy_bbpll_en_usb() was introduced to tackle WiFi and USB interference on ESP32-S3 and ESP32-C3. We haven't encountered similar problem with the S2, so the phy_bbpll_en_usb() function is not implemented for S2.

Thus this option will be hidden for ESP32-S2, thanks!

@imoverclocked
Copy link

Does it make sense to alias this to a noop for non-esp32-s3/c3?

@tore-espressif
Copy link
Collaborator

Does it make sense to alias this to a noop for non-esp32-s3/c3?

No, it doesn't. phy_bbpll_en_usb() is considered to be a workaround for a bug that is specific to S3 and C3, so we don't want to define (empty) implementation for other chips. It might confuse everyone. A better solution is to offer the workaround only for chips that need it

@Akellych
Copy link

Akellych commented Mar 3, 2024

I have the same error when I enable ESP_PHY_ENABLE_USB in SDK_Config ComponentConfig->Phy->Enable USB when phy init
in the phy_init.c file there are the following lines
#if CONFIG_ESP_PHY_ENABLE_USB
phy_bbpll_en_usb(true);
#endif
in function esp_phy_load_cal_and_init(void)
maybe this is the problem on chip S2

@espressif-bot espressif-bot added Status: Done Issue is done internally Resolution: NA Issue resolution is unavailable and removed Status: Reviewing Issue is being reviewed labels Mar 7, 2024
espressif-bot pushed a commit that referenced this issue Mar 13, 2024
…upported targets

"Enable USB when phy init" Kconfig option would call esp_phy function
`phy_bbpll_en_usb()` that is not implemented for all targets.
Selecting this option for unsupported target results in linking error.

The necessity of this workaround is now defined soc_caps.h rather than
in the Kconfig.

Closes #12185
espressif-bot pushed a commit that referenced this issue Mar 15, 2024
…upported targets

"Enable USB when phy init" Kconfig option would call esp_phy function
`phy_bbpll_en_usb()` that is not implemented for all targets.
Selecting this option for unsupported target results in linking error.

The necessity of this workaround is now defined soc_caps.h rather than
in the Kconfig.

Closes #12185
DarkZeros pushed a commit to DarkZeros/esp-idf that referenced this issue May 3, 2024
…upported targets

"Enable USB when phy init" Kconfig option would call esp_phy function
`phy_bbpll_en_usb()` that is not implemented for all targets.
Selecting this option for unsupported target results in linking error.

The necessity of this workaround is now defined soc_caps.h rather than
in the Kconfig.

Closes espressif#12185
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Resolution: NA Issue resolution is unavailable Status: Done Issue is done internally Type: Bug bugs in IDF
Projects
None yet
Development

Successfully merging a pull request may close this issue.

7 participants